假设我有这个功能:
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)
在每个分组中,这些陈述是否相同?或者在某些初始化中是否有额外的(可能是可优化的)副本?
我见过有人说过这两件事.请引用文字作为证据.还请添加其他案例.
这是一个小代码片段:
class A
{
public:
A(int value) : value_(value)
{
cout <<"Regular constructor" <<endl;
}
A(const A& other) : value_(other.value_)
{
cout <<"Copy constructor" <<endl;
}
private:
int value_;
};
int main()
{
A a = A(5);
}
Run Code Online (Sandbox Code Playgroud)
我假设输出将是"常规构造函数"(对于RHS),后面是LHS的"复制构造函数".所以我避免使用这种风格并始终将类的变量声明为A a(5);.但令我惊讶的是上面的代码从未调用过复制构造函数(Visual C++ 2008)
有没有人知道这种行为是由编译器优化,还是C++的一些记录(和可移植)功能引起的?谢谢.
我正在阅读直接初始化和复制初始化(§8.5/ 12)之间的区别:
T x(a); //direct-initialization
T y = a; //copy-initialization
Run Code Online (Sandbox Code Playgroud)
我从阅读有关复制初始化的内容中了解到,它需要可访问和非显式的复制构造函数,否则程序将无法编译.我通过编写以下代码验证了它:
struct A
{
int i;
A(int i) : i(i) { std::cout << " A(int i)" << std::endl; }
private:
A(const A &a) { std::cout << " A(const A &)" << std::endl; }
};
int main() {
A a = 10; //error - copy-ctor is private!
}
Run Code Online (Sandbox Code Playgroud)
GCC给出了一个错误(ideone)说:
prog.cpp:8:错误:'A :: A(const A&)'是私有的
到目前为止,一切都很好,重申Herb Sutter所说的,
复制初始化意味着在必要时首次调用用户定义的转换后,使用复制构造函数初始化对象,并且等效于"T t = u;"形式:
之后,我通过评论private …