gpt4 book ai didi

c++ - 定义两个变量 : Is "Type a(arg), b(arg);" completely equivalent to "Type a(arg); Type b(arg);"?

转载 作者:可可西里 更新时间:2023-11-01 16:36:33 29 4
gpt4 key购买 nike

假设我想定义两个 {Type} 类的变量。构造函数采用 1 个参数。下面两种方式是否完全等价(编译成相同的目标代码)?

Type a(arg), b(arg);

Type a(arg);
Type b(arg);

这个问题是在我阅读了一个讨论异常安全的页面后出现的 --- http://www.gotw.ca/gotw/056.htm有一个指南“在其自己的代码语句中执行每个资源分配(例如,新的),立即将新资源提供给管理器对象。”它举了一个例子:以下代码段是安全的

auto_ptr<T> t1( new T );
auto_ptr<T> t2( new T );
f( t1, t2 );

但是下面这行是不安全的

f( auto_ptr<T>( new T ), auto_ptr<T>( new T ) );

那么,怎么样

auto_ptr<T> t1( new T ), t2( new T );
f( t1, t2 );

我查了C++语言标准的文档,没有发现具体说明这个问题。

把水搅浑,怎么样

shared_ptr<T> t1( new T );
shared_ptr<T> t2( t1 );

shared_ptr<T> t1( new T ), t2( t1 );

最佳答案

是的,它们是等价的。参见 C++11,8/3:

Each init-declarator in a declaration is analyzed separately as if it was in a declaration by itself97.

脚注 97 相当长,它说 T D1, D2, ... Dn; “通常”相当于 T D1; T D2; ... T Dn; ,异常(exception)情况是 T 的含义在随后的声明中,您所做的声明会受到影响。给出的两个例子:

struct S {};
S S, T; // is not equivalent to:
S S; S T;

auto i = 1, j = 2.0; // is not equivalent to:
auto i = 1; auto j = 2.0;

但在这两种情况下,其中一个备选方案是错误的,因此这不是导致您必须启动调试器的区别。

无论如何,auto_ptr<T> t1( new T ), t2( new T );auto_ptr<T> t1( new T ); auto_ptr<T> t2( new T ); 一样安全

请注意,不能保证等效源代码编译为相同的目标代码,只能保证它们具有相同的含义。在您的示例中,包含调试注释的目标代码在源代码行号方面会有合理的差异,但编译器也可能会由于一些不明确的原因或根本没有充分的理由引入意外的差异。

关于c++ - 定义两个变量 : Is "Type a(arg), b(arg);" completely equivalent to "Type a(arg); Type b(arg);"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8409416/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com