假设我想定义类{Type}的两个变量.构造函数需要1个参数.以下两种方式完全等效(编译为相同的目标代码)?
Type a(arg), b(arg);
Run Code Online (Sandbox Code Playgroud)
和
Type a(arg);
Type b(arg);
Run Code Online (Sandbox Code Playgroud)
在我阅读了一篇关于异常安全的网页后出现了这个问题--- http://www.gotw.ca/gotw/056.htm 有一条指南"在自己的代码声明中执行每个资源分配(例如,新的)立即将新资源提供给经理对象." 它给出了一个示例:以下代码段是安全的
auto_ptr<T> t1( new T );
auto_ptr<T> t2( new T );
f( t1, t2 );
Run Code Online (Sandbox Code Playgroud)
但下面这行不安全
f( auto_ptr<T>( new T ), auto_ptr<T>( new T ) );
Run Code Online (Sandbox Code Playgroud)
那么,怎么样
auto_ptr<T> t1( new T ), t2( new T );
f( t1, t2 );
Run Code Online (Sandbox Code Playgroud)
我查阅了C++语言标准的文档,但没有发现任何指定此问题的内容.
要浑水,怎么样
shared_ptr<T> t1( new T );
shared_ptr<T> t2( t1 );
Run Code Online (Sandbox Code Playgroud)
和
shared_ptr<T> t1( new T ), t2( t1 );
Run Code Online (Sandbox Code Playgroud)
是的,它们是等价的.见C++ 11,8/3:
声明中的每个init-declarator都会被单独分析,就好像它本身就是一个声明97.
脚注97相当冗长,它表示T D1, D2, ... Dn;"通常"等同于T D1; T D2; ... T Dn;,但例外情况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;
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,其中一个替代方案是错误,因此这不会导致您不得不启动调试器.
无论如何是的,auto_ptr<T> t1( new T ), t2( new T );就像安全一样auto_ptr<T> t1( new T ); auto_ptr<T> t2( new T );
请注意,无法保证等效源编译为相同的目标代码,只能保证它具有相同的含义.在您的示例中,包含调试注释的对象代码在源行数方面会有合理的差异,但编译器可能会因某些模糊的原因或根本没有充分的理由而引入意外的差异.
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |