當運行上的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