具有右值引用的 C++ 模板化方法消歧规则

标签 c++ c++11

在以下示例中,调用了 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/

相关文章:

c++ - 在没有 move 构造函数的情况下返回不可复制对象的解决方法

c++ - 如果 C++11 的 lambda 表达式支持默认参数怎么办?

c++ - 如何以一种不错的方式禁用 OpenMP 指令?

c++ - 将 CreateProcess 输入流重定向到文件

c++ - 组合函数、绑定(bind)、C++ 和托管代码

c++ - 为什么 llvm::SmallVector 拆分它的存储?

c++ - 为什么我可以在不包含 STL 的情况下使用 nullptr?

c++ - 如何提供几个工作函数的例子?

c++ - 使用 FFmpeg API 将 RTP 负载数据写入音频文件

c++ - 头部姿势估计opencv