Const rvalue compiler difference
c++, c++11, rvalue-reference
Solution
GCC is correct. From paragraph 4 of 3.10 Lvalues and rvalues [basic.lval]:
Class prvalues can have cv-qualified types; non-class prvalues always have cv-unqualified types. [...]
A function call such as `fun_ci()` is in fact a prvalue*, and as such has type `int`, not `const int`. `int&&` is a better match than `const int&&`, and should be picked by overload resolution.
*: it's customarily said that top-level cv-qualifiers are ignored for non-class return types.
Problem
Consider this code: ``` #include <iostream> void f(int&& i) { std::cout << "f(int&&)\n"; } void f(const int&& i) { std::cout << "f(const int&&)\n"; } int fun_i() { return 0; } const int fun_ci() { return 0; } int main() { f(fun_i()); f(fun_ci()); } ``` If I compile this with MSVC 2012, the output is: ``` f(int&&) f(const int&&) ``` If I compile with GCC 4.7, the output is: ``` f(int&&) f(int&&) ``` Which is correct? (If I remove the second definition of f, the program will not compile under MSVC 2012, but it does compile under GCC 4.7.)