大多数时候我看到常量 C 字符串定义为:
static char const* MY_CONSTANT = "Hello World";
然而,指针本身不是const
。像下面这样做不是更合适吗?
static char const* const MY_CONSTANT = "Hello World";
我认为有 2 个具有像这样的常量全局变量的目标:
- 不允许修改字符串
- 不允许变量指向其他任何东西
我只是假设在定义常量字符串时需要这两个目标。
另一件有趣的事是我被允许这样做:
int main()
{
auto MY_CONSTANT = "";
MY_CONSTANT = "Another String";
}
这告诉我 auto
将字符串推断为 char const*
而不是 char const* const
。
所以我有两个主要问题:
- 定义常量 c 样式字符串的最合适方法是什么(我想常量指针指向某物,是更普遍的问题吗?)。为什么选择其中之一?
- 关于我的
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/