【问题标题】:Preferred way of conditionally initializing a const有条件地初始化 const 的首选方式
【发布时间】:2017-01-06 12:46:13
【问题描述】:

初始化 const 自动变量的首选方法是什么?我能想到几个。

if声明:

const std::string s;
if( condition ) { const_cast<std::string&>(s) = "first"; }
else { const_cast<std::string&>(s) = "second"; }

?:运营商:

const std::string s = ( condition ) ? "first" : second;

立即调用的函数表达式:

const std::string s = [ & ] () 
    { if( condition ) return "first" else return "second" } ();

【问题讨论】:

  • 我看不到您如何使用第一种方法初始化 const 变量。 std::string s 本身并不是 const
  • @raymai97 确实如此。固定。

标签: c++11 initialization constants


【解决方案1】:
【解决方案2】:

您的if 语句示例没有初始化任何const,因为s 不是const

关于其他选项(这主要是主观的),这是我的指导方针:

  • 当表达式简短易于阅读时,使用?:(三元运算符)。在你的情况下,我认为没问题。

  • 使用 IIFE (立即调用的函数表达式) 或将初始化重构为返回值的函数当初始化逻辑长且复杂以及何时它会对初始化变量的函数的可读性产生负面影响。

【讨论】:

    【解决方案3】:

    初始化 const 自动变量的首选方法是什么?

    首选的方法是尽可能简单

    带有条件语句:

    std::string const a = condition ? "second" : "first";
    

    使用函数调用(此处为 C++17 constexpr):

    constexpr char const* get_const(int condition) {
        switch(condition) {
        case 0: return "first";
        case 1: return "second";
        default: return "default";
        }
    }
    std::string const b = get_const(condition);
    

    【讨论】:

    • 为什么是switch?为什么int?您的get_const 应该简单地接受bool 并通过三元返回。您的 constexpr 函数在 C++14 中也有效,如果您只是在其主体中使用三元运算符,则在 C++11 中也是有效的。
    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2014-12-29
    • 2022-01-15
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多