【发布时间】:2017-05-26 19:46:12
【问题描述】:
cppreference.com 和 C++11 Standard 使用的语言在临时对象的生命何时延长(强调我的)方面存在细微差别。
每当引用绑定到临时对象或临时对象的基础子对象时,临时对象的生命周期就会延长以匹配引用的生命周期,
第二个上下文是引用绑定到临时的。引用所绑定的临时对象或作为引用所绑定的子对象的完整对象的临时对象在引用的生命周期内持续存在,但以下情况除外:
按照标准,a subject can be a member subject, a base class subject, or an array element。
如果我们在下面的示例代码中严格按照标准的措辞进行
struct Foo
{
Foo() : a(10), b(20) {}
~Foo() { std::cout << "In Foo::~Foo()\n"; }
int a;
int b;
};
Foo getFoo()
{
return Foo();
}
void testFoo1()
{
int const& r = getFoo().a;
std::cout << "In testFoo1()\n";
(void)r; // Shut up the compiler
}
getFoo() 返回的对象的生命周期应该延长到引用的生命周期。但是,a simple test 似乎表明它没有。
标准使用的措辞是否存在缺陷?
编译器不符合要求吗?
cppreference.com 使用的措辞是否存在缺陷?
更新
cppreference.com 使用的语言已更新为(强调我的):
每当引用绑定到临时对象或其子对象时,临时对象的生命周期就会延长以匹配引用的生命周期,但以下情况除外:
【问题讨论】:
-
编译器不会按照标准所说的去做。一定是标准中的错误!不可能是编译器的错误!
-
抛开Snark,见gcc.gnu.org/bugzilla/show_bug.cgi?id=54293。这在 GCC 7 中已修复。cppreference 和标准在编写时是正确的。
-
@T.C.,cppreference.com 的措辞暗示,无论是否有意,临时对象的生命周期都不会通过获取成员子对象的引用来延长。
-
好吧,它没有说它没有扩展......已修复。
-
使用 gcc/clang here 按预期工作。
标签: c++ c++11 language-lawyer temporary-objects