当运行上的gcc 8以下代码(https://wandbox.org/,用 “克++ prog.cc -Wall -Wextra -std = C++ 1Z”):C++结合参考构件构造符参数
#include <iostream>
class B{
public:
B(): copy(false){ std::cout << "B-constructed" << std::endl;}
B(const B& b): copy(true){ std::cout << "B-copy-constructed" << std::endl; }
~B(){ std::cout << (copy?"B-destructed":"B-(copy)-destructed") << std::endl;}
bool copy;
};
class A{
public:
A(B b): bref(b){std::cout << "A-constructed" << std::endl;}
~A() {std::cout << "A-destructed" << std::endl;}
B &bref;
};
void f(){
B b;
A a(b);
std::cout << "f over" << std::endl;
}
int main()
{
f();
std::cout << "main over" << std::endl;
return 0;
}
以下输出得到:
B-constructed
B-copy-constructed
A-constructed
B-destructed
f over
A-destructed
B-(copy)-destructed
main over
对象破坏的顺序看起来很不寻常。就好像构造函数参数的生命期被延长一样。该标准是否说明绑定成员对构造函数参数的引用?
我不认为从标准的这句话适用,因为参数不是一个临时对象(但我不知道“临时表达式”的定义):
临时表达绑定到mem初始化器中的引用成员是不合格的。 [实施例:
结构A {
A():V(42){} //错误
const int的& V;
};
末端示例]
你混了在字符串'〜B':如果它是一个副本,说这通常破坏,如果没有,说是复制破坏 –
那么什么是问题呢?在修复之后,你认为在施工/破坏顺序方面有什么错误? –
现在订单看起来不错。然而,问题仍然是标准是否说明了绑定成员对构造函数参数的引用。 – user42768