從可以放入結構化系結陳述句的方法回傳的物件的銷毀順序是否有任何定義?cppreference 似乎沒有提到破壞順序,對 Godbolt 的快速測驗揭示了一些與我預期不同的東西。
#include <iostream>
#include <tuple>
struct A{
A()=default;
~A(){ std::cout << "~A()" << std::endl; }
};
struct B{
B()=default;
~B(){ std::cout << "~B()" << std::endl; }
};
struct C{
C()=default;
~C(){ std::cout << "~C()" << std::endl; }
};
auto MakeStuff()
{
auto a = A{};
auto b = B{};
auto c = C{};
return std::make_tuple(std::move(c), std::move(b), std::move(a));
}
int main()
{
auto&& [c, b, a] = MakeStuff();
std::cout << "Results now: " << std::endl;
}
結果:
Program returned: 0
~C()
~B()
~A()
Results now:
~C()
~B()
~A()
我猜結構化系結從右到左構造 [brackets] 中的物件,看看解構式是如何呼叫的cfirst, then b, then a。這是標準行為,還是我在這里依賴特定于實作的東西?
謝謝你。
uj5u.com熱心網友回復:
就構造/破壞的順序而言,結構化系結絕對不會改變語言。結構化系結是一種虛構,一種語言速記,可以變成get<I>(unnamed_object)或。在這個虛構中,是由運算式生成并由結構化系結宣告捕獲的實際物件。unnamed_object.some_namesome_nameunnamed_objectauto[]
該物件的作業方式與任何其他 C 物件完全相同。類(如果是類)中子物件宣告的順序決定了構造和銷毀的順序,就像任何其他 C 物件一樣。
現在,當涉及到 時std::tuple,它的子物件宣告的順序是未指定的;允許因實施而異。同樣,結構化系結與此無關。因此,破壞順序可以是您的特定實作想要的任何順序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484063.html
下一篇:查找以用戶輸入的字母開頭的單詞
