c++ - 在各种开关情况下初始化变量

标签 c++ c++11

我需要编写以下代码(在 C++11 中):

X x;
if( cond ) {
    x = X(foo);
}
else {
    x = X(foo, bar);
}
// ... continue using x

问题是“X x”将调用默认构造函数并创建不需要的 X 类型对象。

我该如何解决这个问题?我怀疑可能有一些涉及新的 && 运算符的解决方案,但我不太明白......

最佳答案

使用它来避免任何临时对象:

auto&& x = cond ? X(foo) : X(foo, bar);

如果初始化更复杂,使用 lambda:

auto&& x = [&]()->X{
    if(cond1)
        return {};
    if(cond2)
        return {foo};
    return {foo, bar};
}();

使用通用引用,lambda 通过引用获取,以避免无用的复制。

还使用了没有未命名临时文件的列表初始化,因此不会为 lambda 的返回进行任何复制。

请注意,列表初始化语法有利于期望初始化列表的构造函数。
在这种情况下,您必须依赖 RVO。

关于c++ - 在各种开关情况下初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26265966/

相关文章:

c++ - 从嵌套类中对父类进行类型推导

c++ - stringstream::operator>> 只读取,不从流中提取下一个标记

c++ - fprintf 和 ofstream 无需打开文件即可使用

c++ - lambda 的别名

c++ - 为什么 std::atomic 在 Visual C++ 中不是简单的类型?

c++ - 当 this 实例化为 const 时抛出异常

c++ - 可以使用 libcurl 将远程文件作为 istream 读取吗?

c++ - 在成员初始化列表中填充 std::array

c++ - 如何转发 std::initializer_list<T>?

c++ - 从 C++ 文件中读取包含 std::vector 的对象