将r值传递给构造函数时是否有任何限制?

时间:2011-11-27 17:26:27

标签: c++ c++11

我正在尝试将临时对象传递给另一个对象构造函数,以便第二个对象获取所生成对象的所有权。我的代码是这样的

class A {
};

class B {
    A a;
    public:
        B(A && _a) : a(_a) {}

        void test(){ }
};

int main(int argc, const char *argv[])
{
    B b(A());
    b.test();
    return 0;
}

但是我收到了这个我无法理解的错误

$ g++ -std=c++0x main.cpp  
main.cpp: In function 'int main(int, const char**)': 
main.cpp:15:7: error: request for member 'test' in 'b', which is of non-class type 'B(A (*)())'

也许这只是一个愚蠢的语法错误,但如果不是,你会如何定义这样的构造函数来获取某些创建资源的所有权?

由于

1 个答案:

答案 0 :(得分:3)

你被所谓的C ++最令人烦恼的解析所抓住了。你的行

B b(A());

定义使用b类型的临时对象初始化的B类型的对象A,但声明函数 named b使用一个未命名的类型(指向a)函数的参数,不带参数并返回A(因此b的参数类型被声明为函数类型{{ 1}}并衰减到您可以在错误消息中看到的指针到函数类型A(),并返回一个B.

最简单的方法是将该行更改为

A(*)()

在C ++ 11中,最好的选择是使用新的初始化程序语法并编写

B b = B(A());