值初始化自动对象?

tem*_*def 30 c++ initialization

我正在编写一个模板类,在我的代码中的某一点上,我希望能够在栈上对参数化类型的对象进行值初始化.现在,我正在通过写一些这样的效果来实现这一目标:

template <typename T> void MyClass<T>::doSomething() {
    T valueInitialized = T();
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

此代码有效,但(除非编译器是智能的)它需要不必要的创建和销毁临时T对象.我想写的是以下内容,我知道这是不正确的:

template <typename T> void MyClass<T>::doSomething() {
    T valueInitialized(); // WRONG: This is a prototype!
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有一种很好的方法来初始化自动对象,而不必显式构造临时对象并将其分配给自动对象.可以这样做吗?或者它是T var = T();如此好?

ild*_*arn 23

以下使用复制初始化,在C++ 03中95%的时间都可能很好:

T var = T();
Run Code Online (Sandbox Code Playgroud)

但是对于通用 C++ 03代码,您应该总是更喜欢直接初始化来解释其他5%的代码:

T var((T())); // extra parentheses avoid the most vexing parse – the extra parentheses
              // force the contents to be evaluated as an expression, thus implicitly
              // *not* as a declaration.
Run Code Online (Sandbox Code Playgroud)

或者更好的是,使用Boost.Utility.ValueInit库,它为您打包理想的行为以及各种编译器缺陷的解决方法(遗憾的是,不止一个人会想到):

boost::value_initialized<T> var;
Run Code Online (Sandbox Code Playgroud)

对于C++ 11,可以使用列表初始化语法以明显不那么嘈杂/丑陋的方式实现直接值初始化:

T var{}; // unambiguously value-initialization*
Run Code Online (Sandbox Code Playgroud)

(*Nb这只是没有一元构造函数的类型的值初始化std::initializer_list<>;对于那些类型,将调用该构造函数 - "统一初始化"确实......当然,最终结果应该是对于理智的类型也一样.)

  • 呃,看起来像LISP.`:)`这真的适用于所有类型吗?"+ 1"来自我建议一个升级库. (8认同)

fre*_*low 16

您可以在C++ 0x中使用花括号:

T valueInitialized{};
Run Code Online (Sandbox Code Playgroud)


sbi*_*sbi 5

不,没有任何其他方法可以在C++ 03中可靠地初始化模板类型.

如果你只能依靠T默认构造函数的类类型,你可以写

T valueInitialized;
Run Code Online (Sandbox Code Playgroud)

但如果T可能是一个内置类型,

T valueInitialized = T();
Run Code Online (Sandbox Code Playgroud)

是要走的路.

您是否有任何理由不相信您的编译器来优化该副本?