C++ 临时右值引用对象的生存期
假设您有以下代码(在c++14中): 当调用析构函数时,返回值存储在何处?它的析构函数是C++ 临时右值引用对象的生存期,c++,c++14,language-lawyer,C++,C++14,Language Lawyer,假设您有以下代码(在c++14中): 当调用析构函数时,返回值存储在何处?它的析构函数是aconst(考虑到函数不返回const),标准中是如何规定的? (甚至合法吗) 另外,您是否确认,临时函数确实绑定到a,并且不会调用任何操作符=构造函数 它在g++上编译并避免键入长模板类,但在使用它之前,我想检查它是否在c++14中有明确说明是的,这是可以保证工作的 [12.2/4-5] 有两种情况下,时间单位在不同的点被破坏,而不是在完整表达的结尾 第二个上下文是将引用绑定到临时上下文。引用绑定到的临时
a
const
(考虑到函数不返回const
),标准中是如何规定的?
(甚至合法吗)
另外,您是否确认,临时函数确实绑定到a
,并且不会调用任何操作符=
构造函数
它在g++上编译并避免键入长模板类,但在使用它之前,我想检查它是否在c++14中有明确说明是的,这是可以保证工作的 [12.2/4-5] 有两种情况下,时间单位在不同的点被破坏,而不是在完整表达的结尾 第二个上下文是将引用绑定到临时上下文。引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生存期内持续存在,但以下情况除外:
- 绑定到函数调用中引用参数的临时对象将持续存在,直到包含该调用的完整表达式完成
- 函数返回语句中与返回值临时绑定的生存期不延长;在return语句的完整表达式末尾销毁临时表达式
- 在包含新初始值设定项的完整表达式完成之前,与新初始值设定项中引用的临时绑定将一直存在
没有调用构造函数或
运算符=
来初始化a
,如果不需要,则a
不是const
。是的,这保证工作正常
[12.2/4-5]
有两种情况下,时间单位在不同的点被破坏,而不是在完整表达的结尾
第二个上下文是将引用绑定到临时上下文。引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生存期内持续存在,但以下情况除外:
- 绑定到函数调用中引用参数的临时对象将持续存在,直到包含该调用的完整表达式完成
- 函数返回语句中与返回值临时绑定的生存期不延长;在return语句的完整表达式末尾销毁临时表达式
- 在包含新初始值设定项的完整表达式完成之前,与新初始值设定项中引用的临时绑定将一直存在
没有调用构造函数或
运算符=
来初始化a
,如果不需要,则a
不是const
。规则在[class.temporary]中:
有三种情况下,临时性词语在不同于完整表达结束时被销毁。[…]第三个上下文是引用绑定到临时对象的上下文。116引用所绑定到的临时对象
绑定的或作为引用绑定到的子对象的完整对象的临时对象在引用的生存期内持续存在,除了:-在函数调用(5.2.2)[…]中绑定到引用参数的临时对象
-函数返回语句(6.6.3)中返回值的临时绑定的生存期为[…]
-与新初始值设定项(5.3.4)中引用的临时绑定持续到[…] 在本例中:
auto && a = a_function_returning_a_temp_rvalue();
我假设函数返回类型为
T
(与T&
或T&
相反)。在这种情况下,我们确实对引用进行了临时绑定,这些异常都不适用。因此,该临时文件的生存期延长为a
的生存期 规则在[class.temporary]中:
有三种情况下,临时性词语在不同于完整表达结束时被销毁。[…]第三个上下文是引用绑定到临时对象的上下文。116引用所绑定到的临时对象
绑定的或作为引用绑定到的子对象的完整对象的临时对象在引用的生存期内持续存在,除了:-在函数调用(5.2.2)[…]中绑定到引用参数的临时对象
-函数返回语句(6.6.3)中返回值的临时绑定的生存期为[…]
-与新初始值设定项(5.3.4)中引用的临时绑定持续到[…] 在本例中:
auto && a = a_function_returning_a_temp_rvalue();
我假设函数返回类型为
T
(与T&
或T&
相反)。在这种情况下,我们确实对引用进行了临时绑定,这些异常都不适用。因此,该临时文件的生存期延长为a
的生存期 auto
用作模板参数推断,除了一些例外。我知道,但我想知道右值的生存期(我猜,因为它绑定到a
,它与a
相同,但我想知道它在标准中是如何说的,在哪里说的)auto
用作模板参数推断,除了一些例外。我知道,但我想知道右值的生存期(我猜,因为它绑定到a
,它与a
相同,但我想知道它在标准中是如何说的,在哪里说的)