gpt4 book ai didi

c++ - 值初始化一个自动对象?

转载 作者:IT老高 更新时间:2023-10-28 12:43:12 24 4
gpt4 key购买 nike

我正在编写一个模板类,并且在我的代码中的某一时刻希望能够对堆栈上参数化类型的对象进行值初始化。现在,我正在通过写一些东西来实现这一点:

template <typename T> void MyClass<T>::doSomething() {
T valueInitialized = T();
/* ... */
}

这段代码可以工作,但是(除非编译器很聪明)它需要对临时 T 对象进行不必要的创建和销毁。我想写的是以下内容,我知道这是不正确的:

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

我的问题是,是否有一种很好的方法可以对自动对象进行值初始化,而无需显式构造临时对象并将其分配给自动对象。这可以做到吗?还是 T var = T(); 就这么好?

最佳答案

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

T var = T();

但对于 generic (C++03) 代码,您应该始终更喜欢 direct-initialization 来占另外 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.

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

boost::value_initialized<T> var;

对于 C++11,可以使用列表初始化语法以一种明显减少噪音/丑陋的方式实现直接值初始化:

T var{}; // unambiguously value-initialization†

(注:从技术上讲,这将调用 std::initializer_list<> 构造函数,而不是对某些病态类型执行值初始化。大概最终结果应该是相同的。)

关于c++ - 值初始化一个自动对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6298001/

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