为什么左值和右值参考之间的不同行为如下所示?

时间:2018-05-01 19:27:17

标签: c++ reference language-lawyer

在初始化const左值引用时,

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。所以我很清楚这是一个有效的问题。

0 个答案:

没有答案