在以下示例中,调用了 ctors #1、#1、#4 和 #4(按此顺序)。我希望改为调用 #1、#1、#2、#3(折扣 RVO )。
//-----------------------------------------------------------------------------
struct A
{
A(){} // 1
A(A&&){} // 2
A(const A&){} // 3
template<typename T>
A(T&&){} // 4
template<>
A(A&&){} // 5
template<typename T>
A(const T&){} // 6
};
//-----------------------------------------------------------------------------
A wtf(){ A x; return x; }
//-----------------------------------------------------------------------------
int main( int, char*[] )
{
A a;
A c = wtf();
A b(c);
}
这是怎么回事,为什么?!
注意:删除#5 以使用 GCC 进行编译(无论如何它并不那么重要)- 上面的代码确实可以使用 VS2010 进行编译。如果有人可以测试的话,我很想知道 GCC 中的结果是否相同。
最佳答案
这是一个编译器错误。
忘记了关于return local
表达式(以及throw local
表达式,顺便说一下)的隐式右值的讨论,这显然是一个编译器错误,因为——
没有模板构造函数应该在您的示例代码中被调用。
不能将模板函数视为复制构造函数、复制赋值运算符、移动构造函数或移动赋值运算符。
C++11 支持是不完整的,尽管 gcc 是 the best它仍然不完整且存在错误。
关于具有右值引用的 C++ 模板化方法消歧规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7435847/