我正在为GCC提交一个bug,但我想再次确认一下。
考虑以下程序:
#include <utility>
template<typename T, typename A>
void F(A&& a) { T(std::forward<A>(a)); } // Note: () syntax.
int main() { int i; F<int&>(i); }
并且:
#include <utility>
template<typename T, typename A>
void F(A&& a) { T{std::forward<A>(a)}; } // Note: {} syntax.
int main() { int i; F<int&>(i); }
最新的Clang和MSVC编译器支持这两个程序。GCC 5及以上版本接受第一个程序但拒绝第二个,声称“将类型为'int'的rvalue表达式无效转换为类型'int&'”。这是GCC的一个错误吗?还是这确实是上述情况下{}和()之间的区别(因此是Clang和MSVC的错误)?
编辑:问题可以缩小到以下简单摘录:
int i; (int&){i};
并且
int i; (int&)(i);
T{x}
没有明确定义,请参见核心问题1521。 - T.C.