Tho*_*ard 39 c++ gcc const constexpr c++11
很明显constexpr意味着const,因此常见的是:
constexpr int foo = 42; // no const here
Run Code Online (Sandbox Code Playgroud)
但是,如果你写:
constexpr char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)
然后,如果传递了-Wwrite-string标志,GCC将产生"警告:从字符串常量弃用转换为'char*'".
写作:
constexpr const char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.
那么constexpr const和constexpr真的一样吗?
T.C*_*.C. 66
问题是在变量声明中,constexpr始终将const-ness 应用于声明的对象; const另一方面,取决于位置,可以应用于不同类型.
从而
constexpr const int i = 3;
constexpr int i = 3;
Run Code Online (Sandbox Code Playgroud)
是等价的;
constexpr char* p = nullptr;
constexpr char* const p = nullptr;
Run Code Online (Sandbox Code Playgroud)
是等价的; 既能使p一个const指针char.
constexpr const char* p = nullptr;
constexpr const char* const p = nullptr;
Run Code Online (Sandbox Code Playgroud)
是等价的.constexpr做p一个const指针.将const在const char *使p指向const char.
您看到的错误消息与constexpr关键字本身无关。
像“foo”这样的字符串文字,如下所示:
somefunction("foo");
Run Code Online (Sandbox Code Playgroud)
此字符串文字的类型是const char *. 以下声明:
char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)
这会尝试为一个const char *值分配一个char *值。结果char *值是不可变的、常量,但到那时错误已经发生:尝试将 a 转换const char *为 a char *。
constexpr您示例中的关键字只是一种干扰,与错误无关。
| 归档时间: |
|
| 查看次数: |
14072 次 |
| 最近记录: |