c++ - 在 C++ 中定义常量 C 字符串的正确方法?

标签 c++ c++11 constants auto cstring

大多数时候我看到常量 C 字符串定义为:

static char const* MY_CONSTANT = "Hello World";

然而,指针本身不是const。像下面这样做不是更合适吗?

static char const* const MY_CONSTANT = "Hello World";

我认为有 2 个具有像这样的常量全局变量的目标:

  1. 不允许修改字符串
  2. 不允许变量指向其他任何东西

我只是假设在定义常量字符串时需要这两个目标。

另一件有趣的事是我被允许这样做:

int main()
{
    auto MY_CONSTANT = "";
    MY_CONSTANT = "Another String";
}

这告诉我 auto 将字符串推断为 char const* 而不是 char const* const

所以我有两个主要问题:

  1. 定义常量 c 样式字符串的最合适方法是什么(我想常量指针指向某物,是更普遍的问题吗?)。为什么选择其中之一?
  2. 关于我的 auto 示例,它为什么选择 char const* 是有道理的(因为它是常量数据数组,而不是指针本身)。我可以让 auto 推断为 char const* const 还是可以更改代码以使其产生这种类型?

最佳答案

如果它真的是一个常量,那么 constexpr 将是 C++11 的方法:

constexpr char const* MY_CONSTANT = "Hello World";

第一个例子:

static char const* MY_CONSTANT = "Hello World";

只是说我有一个指向具有静态存储持续时间的 char const 的指针,如果它在函数之外,它将使其成为全局变量。

如果我们要求指针也是 const,那么我们需要您介绍的第二种形式。这完全取决于指针是否确实应该为 const 。在大多数情况下,您看到没有顶级 const 的代码的原因是因为他们只是忘记将其放入,而不是因为他们并不意味着指针也是 const。

static 会有所不同,例如,如果您希望 const 成员是每个实例还是每个类:

class A
{
        char const* const const_per_instance = "Other Const String";
    public:
        constexpr static char const* const const_per_class = "Hello World" ;
};

如果我们要求 const 是每个类的,那么我们需要使用 static 否则不需要。如果您不允许使用 constexpr,示例会略有变化:

class A
{
        char const* const const_per_instance = "Other Const String";
    public:
        static char const* const const_per_class  ;
};

char const* const A::const_per_class = "Hello World" ;

但本质是一样的只是语法不同。

第二个问题是 Gotw #92表示 auto 会丢弃顶级 const,举个例子如下:

const int   ci  = val;  
auto        g   = ci;

它说:

The type of g is int.

Remember, just because ci is const (read-only) doesn’t have any bearing on whether we want g to be const. It’s a separate variable. If we wanted g to be const, we would have said const auto as we did in case c above

引用的例子如下:

int         val = 0;  
//..
const auto  c   = val;

关于c++ - 在 C++ 中定义常量 C 字符串的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26111271/

相关文章:

c++ - R6025 纯虚函数调用 : What is and how to resolve

c++ - 带有 std::ate 的 std::ofstream 未在末尾打开

c# - 为什么C#限制了可以声明为const的类型集?

rust - 什么时候关联常量使用“static”以外的生命周期有用?

c++ - 类的常规实例可以调用常量函数吗?

c++ - lock_guard 是 RAII 实现还是用于实现 RAII?

C++ vector 连接器以避免复制

c++ - 您可以使用不带::的命名空间从其他类引用函数吗?

c++11 为 std::deque 或 std::list move 插入

c++ - 从基类继承 std::shared_from_this 时的 std::bad_weak_ptr