clang不会延长临时S()
的生命周期。但它在初始化右值引用时确实延长了S()
的生命周期。这是为什么?如果可能的话,我想要一个标准引用的答案。感谢。
#include <iostream>
struct B {
B() { std::cout << "B()\n"; }
~B() { std::cout << "~B()\n"; }
};
struct S
{
int a[3] = { 1, 2, 3 };
B b;
S() { std::cout << "S()\n"; }
~S() { std::cout << "~S()\n"; }
};
int main()
{
const int& r = S().a[0];
B&& rr = S().b;
std::cout << r << '\n';
std::cout << "end of main\n";
}
输出结果为:
B()
S()
~S()
~B()
B()
S()
1
end of main
~S()
~B()
编辑我对这个问题的接受答案表示怀疑,这被认为是一个骗局。这是因为,另外两个答案明确提到GCC在这个主题上有一个错误。我同意这些答案,仅仅是因为GCC没有编译int &&r = S().a[0];
,而且应该根据[cass.temporary]/6进行编译。
除此之外,OP在答案中说GCC打印~P extract
。现在它正在打印extract ~P
。所以我很清楚这是一个有效的问题。