Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:参数中构造的对象何时被销毁?_C++ - Fatal编程技术网

C++ C++;:参数中构造的对象何时被销毁?

C++ C++;:参数中构造的对象何时被销毁?,c++,C++,在参数中构造的对象在函数调用之前或之后被销毁时 例如,以下代码是否安全 void f(const char*) { ... } std::string g() { ... } ... f(g().c_str()); 这对我来说总是有效的,但我不知道这只是未定义的行为还是应该有效 这对我来说总是有效的,但我不知道这只是一种未定义的行为 或者它真的应该起作用 不,不存在未定义的行为,因为g()生成的临时对象将在计算完整表达式(即f()函数体)后被删除 C++标准n3337§12.3/3 当实现引

在参数中构造的对象在函数调用之前或之后被销毁时

例如,以下代码是否安全

void f(const char*)
{ ... }

std::string g()
{ ... }
...
f(g().c_str());
这对我来说总是有效的,但我不知道这只是未定义的行为还是应该有效

这对我来说总是有效的,但我不知道这只是一种未定义的行为 或者它真的应该起作用

不,不存在未定义的行为,因为g()生成的临时对象将在计算完整表达式(即f()函数体)后被删除

C++标准n3337§12.3/3

当实现引入具有非平凡构造函数的类的临时对象时(12.1, 12.8),应确保临时对象需要一名建造师。同样,析构函数应为 使用非平凡析构函数调用临时函数(12.4)。临时对象作为最后一步被销毁 在计算完整表达式(1.9)时,该表达式(在词汇上)包含创建它们的点。这是真的 即使该评估以抛出异常结束。破坏的价值计算和副作用

C++标准n3337§12.3/4

有两种情况下,临时性词语在不同的点被销毁,而不是在全文的结尾- 表情。第一个上下文是调用默认构造函数初始化数组的元素时。如果 构造函数有一个或多个默认参数,即销毁在默认值中创建的每个临时参数 参数在构造下一个数组元素(如果有)之前排序

C++标准n3337§12.3/5

第二个上下文是将引用绑定到临时上下文。(……)

这对我来说总是有效的,但我不知道这只是一种未定义的行为 或者它真的应该起作用

不,不存在未定义的行为,因为g()生成的临时对象将在计算完整表达式(即f()函数体)后被删除

C++标准n3337§12.3/3

当实现引入具有非平凡构造函数的类的临时对象时(12.1, 12.8),应确保临时对象需要一名建造师。同样,析构函数应为 使用非平凡析构函数调用临时函数(12.4)。临时对象作为最后一步被销毁 在计算完整表达式(1.9)时,该表达式(在词汇上)包含创建它们的点。这是真的 即使该评估以抛出异常结束。破坏的价值计算和副作用

C++标准n3337§12.3/4

有两种情况下,临时性词语在不同的点被销毁,而不是在全文的结尾- 表情。第一个上下文是调用默认构造函数初始化数组的元素时。如果 构造函数有一个或多个默认参数,即销毁在默认值中创建的每个临时参数 参数在构造下一个数组元素(如果有)之前排序

C++标准n3337§12.3/5

第二个上下文是将引用绑定到临时上下文。(…)

g()
是临时的。临时数的生存期将延长整个完整表达式的整个计算时间(在您的情况下,这将是
f(g().c_str())
),因此您的使用是安全的,除非
f()
将指针存储在某处

§12.2/4有两种情况下,临时词语在与完整表达结尾不同的位置被销毁。第一个上下文是当表达式作为定义对象的声明器的初始值设定项出现时。在这种情况下,保存表达式结果的临时表达式将一直存在,直到对象的初始化完成。[……]

§12.2/5第二种情况是指引用与临时文件绑定。[……]

这两种情况都不适用于您的示例。

g()
是临时的。临时数的生存期将延长整个完整表达式的整个计算时间(在您的情况下,这将是
f(g().c_str())
),因此您的使用是安全的,除非
f()
将指针存储在某处

§12.2/4有两种情况下,临时词语在与完整表达结尾不同的位置被销毁。第一个上下文是当表达式作为定义对象的声明器的初始值设定项出现时。在这种情况下,保存表达式结果的临时表达式将一直存在,直到对象的初始化完成。[……]

§12.2/5第二种情况是指引用与临时文件绑定。[……]


这两种情况都不适用于您的示例。

在计算包含表达式的完整表达式后,作为表达式计算的一部分构造的临时对象将被销毁,除非它绑定到命名引用。(现行标准草案中的12.2和1.9为相关章节)


因此,在您的示例中,为保存
g
的返回值而构造的临时对象将在
f
返回后销毁。

作为表达式计算一部分构造的临时对象在计算包含表达式的完整表达式后销毁,除非它绑定到命名引用。(现行标准草案中的12.2和1.9为相关章节)


因此,在您的示例中,构造用于保存
g
返回值的临时变量将在
f
返回后销毁。

而不是使用g().data()使用g().c_str(),这只是一个想法@jamolnng这对我手头的问题没有影响。我后来意识到了这一点,这就是我更正它以添加相关内容的地方information@jamolnng我修正了它,data()没有空终止符。使用g().data()代替g().c_str(),只是一个想法@贾莫林塔