我有以下测试程序:
#include <iostream>
#include <type_traits>
#include <utility>
template<typename Ty, std::size_t N>
void foo(Ty (&&)[N])
{
std::cout << "Ty (&&)[" << N << "]\t" << std::is_const<Ty>::value << '\n';
}
template<typename Ty, std::size_t N>
void foo(Ty (&)[N])
{
std::cout << "Ty (&)[" << N << "]\t" << std::is_const<Ty>::value << '\n';
}
template<typename Ty>
using id = Ty;
int main()
{
std::cout.setf(std::cout.boolalpha);
foo(id<int[]>{1, 2, 3, 4, 5});
foo(id<int const[]>{1, 2, 3, 4, 5}); // <-- HERE.
int xs[]{1, 2, 3, 4, 5};
foo(xs);
int const ys[]{1, 2, 3, 4, 5};
foo(ys);
foo(std::move(xs));
foo(std::move(ys));
}
我原本认为带箭头的代码行应该会调用与其上面非const调用类似的rvalue重载函数,但实际情况并非如此。
这是GCC中的一个bug吗?还是标准中有什么规定导致了选择lvalue重载函数?
const int
临时变量被当作int&&
而不是const int&&
。 - Yakk - Adam Nevraumontconst int&&
可以绑定到const int
或int
类型的 xvalues。(我上面说的只适用于prvalues,而不是rvalues)。 - Johannes Schaub - litb