a
被声明为返回一个MyClass的
b
是与一个int参数
c
构建以正常的方式是不带参数
d
需要构建正常方式的功能可访问的复制(/移动) - 构造器,从技术上讲,它将RHS上的临时文件复制到d
,但编译器可能实际上不会调用它。
e
是相同的,但使用int构造函数。如果你没有
MyClass e = 0;
这也将需要的构造函数,使int是非显式的。
要回答“e如何与b不同”的问题。这两个对象是相似的,但如果您的类没有可访问的复制/移动构造函数,则与e
一起使用的构造将无法编译。 (在C++ 11中移动构造函数)
b似乎没有声明函数,所以不会像a一样失败。
在C++ 03,如果你把在
class MyClass {
// etc.
private:
MyClass(const MyClass&);
};
编译器会抱怨与创建d
和e
在行C++ 11
class MyClass {
// etc.
// this can be public too
MyClass(MyClass&&) = delete;
};
将调用当您尝试创建d
和e
时出现编译器错误“使用已删除的函数”。 私人拷贝构造函数也将产生错误,除非你做的事:
class MyClass{
public:
MyClass(){
std::cout << "Called Constructer A \n";
}
MyClass(int n){
std::cout << "Called Constructer B \n";
}
MyClass(MyClass const&) = delete; // cannot copy
MyClass(MyClass &&) = default; // but you CAN move
};
现在你的代码进行编译。
虽然我们是在C++ 11构造的对象,你也可以有:
MyClass f{}; // not a function
MyClass g{1};
MyClass h = MyClass{};
MyClass i = MyClass{0};
MyClass j = {};
MyClass k = {0};
需要注意的是,如果我改变我的移动构造函数(目前=默认值)
MyClass(MyClass &&)
{
std::cout << "Moved\n";
}
我试过了,“Moved”从未打印过。编译器可以(并且)优化它。但它必须可以访问。
可能是几个问题的副本 – CashCow 2014-10-02 12:18:53
好 - 不仅需要一个答案,而且对于我们来说这个问题! – 2014-10-02 12:20:23
请参阅http://stackoverflow.com/q/24953658/981959和[标签:最棘手的解析]。请在创建新问题之前进行搜索 – 2014-10-02 12:23:12