假设我有这个功能:
void my_test()
{
A a1 = A_factory_func();
A a2(A_factory_func());
double b1 = 0.5;
double b2(0.5);
A c1;
A c2 = A();
A c3(A());
}
Run Code Online (Sandbox Code Playgroud)
在每个分组中,这些陈述是否相同?或者在某些初始化中是否有额外的(可能是可优化的)副本?
我见过有人说过这两件事.请引用文字作为证据.还请添加其他案例.
如果我的C++代码(如下所示)有一个初始化为空字符串的字符串,这有什么关系:
std::string myStr = "";
....some code to optionally populate 'myStr'...
if (myStr != "") {
// do something
}
Run Code Online (Sandbox Code Playgroud)
与no/null初始化:
std::string myStr;
....some code to optionally populate 'myStr'...
if (myStr != NULL) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
有没有最好的做法或陷阱?
所以基本上这段代码:
class A {
};
class B {
B (const B& b) {}
public:
B (){}
B (const A& a) {}
};
int main()
{
A a;
B b1(a); //OK
B b2 = a; //Error
}
Run Code Online (Sandbox Code Playgroud)
只生成一个错误B b2 = a.那个错误是
错误:'B :: B(const B&)'是私有的
除了直接转换构造函数之外,为什么还要尝试调用复制构造函数?
从错误消息中可以清楚地看到B创建了一个临时文件然后用于复制构造,但为什么呢?这个标准在哪里?
可能重复:
复制和直接初始化的动机背后的动机是什么?
通过复制初始化,我的意思是这样的:
struct MyStruct
{
MyStruct(int) {}
MyStruct(const MyStruct&) {}
};
MyStruct s = 5; // needs *both* the int and copy constructor
Run Code Online (Sandbox Code Playgroud)
尽管用C++编程多年,但我从未意识到上面的代码需要复制构造函数(感谢jogojapan).暂时一直被遗忘,因此我甚至都不知道它是否存在(至少在肤浅的层面,尽管它被优化了),直到它被指出给我.
经过大量的谷歌搜索,我了解它是如何工作的.我的问题是为什么它是这样的?
为什么标准不能使上面的例子不需要复制构造函数?是否有一些特定的案例/示例表明在这种初始化中需要复制构造函数很重要?
如果没有合理的解释为什么事情就是他们的方式,我只是把它看作是一件讨厌的神器,但如果有一些重要的东西我不想知道,我宁可不要无知.
当我在这里阅读有关复制初始化与直接初始化的内容时.复制构造函数应该在复制初始化时调用.为什么这里复制构造函数不调用?
#include <iostream>
using namespace std;
class A{};
class B{
public:
B(const A &a){cout << "B construct from A" << endl;}
B(const B &b){cout << "B copy constructor" << endl;}
};
int main(){
A a;
B b = a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)