gpt4 book ai didi

c++ - 为什么要为字符串文字声明将const添加到constexpr中?

转载 作者:行者123 更新时间:2023-12-01 08:54:25 30 4
gpt4 key购买 nike

此声明:

char constexpr *const s = "hello";

出现此错误失败:
g++ -g -Wall -Werror -std=c++17 test.cc -o test
test.cc:8:31: error: ISO C++11 does not allow conversion from string literal to 'char *const' [-Werror,-Wwritable-strings]
char constexpr *const s = "hello";

但是,如果我将const添加到constexpr,则编译器很高兴:
char const constexpr *const s = "hello";

汇编:
g++ -g -Wall -Werror -std=c++17 test.cc -o test
./test
hello

这对我来说似乎并不直观。为什么const需要装饰constexpr? constexpr不暗示const吗?如果它是一个编译器常量,那么在某种意义上又不是常量吗?是否有可能将其作为constexpr但以其他某种方式更改,从而使之不是恒定的?

这是一个最小的 bolt :

https://godbolt.org/z/sSQMVa

更新:

StoryTeller的答案是理解这一点的关键。我已经接受了他的回答,但是在这里将对其进行扩展,以防其他尝试了解此问题的人获得帮助。与const交互时,我习惯于将const应用于它左侧的项目。从而:
char a[] = "hello";
char * const s = a;
s[0] = 'H'; // OK
s = "there"; // Compiler error.

在这里, char * const s表示指针s是常量,而它引用的字符是可修改的。另一方面:
char const * s = "hello";
a[0] = 'H'; // Compiler error
s = "there"; // OK

在这种情况下, char const * s表示s指向的字符是const,而不是指针。

好的,大多数使用const和指针的人都了解这一切。我不满意的地方是,我假设constexpr也将以这种方式工作。也就是说,鉴于此:
char constexpr * const s = "hello";

我认为这将意味着指针是const(它是),字符本身将是const和constexpr。但是语法不能那样工作。相反,在这种情况下,constexpr:
  • 不适用于字符,而是...
  • 适用于s本身,它是一个指针,...
  • 因此,
  • 在指针之后对于const是多余的。

  • 因此,在这种情况下,没有在字符上声明const。确实,如果我完全删除constexpr,则会得到完全相同的错误:
    char * const s = "hello"; // Produces same error as char constexpr * const s = "hello";

    但是,这可行:
    constexpr char const * s = "hello";

    以上就是我们想要的,这意味着:
  • 通过const字符是const
  • 并且指针s是const和通过constexpr的编译时间常数
  • 最佳答案

    Doesn't constexpr imply const?



    对于您声明的对象,它在 s上执行。应用 constexpr的结果是对象
    char *const s;

    仍然声明它指向非常量对象。只有地址必须是一个常量表达式。这意味着它必须是具有静态存储持续时间的对象。

    Is it possible for something to be constexpr but change in some other way such that is not constant?



    不。但是再说一遍,不是要声明的对象 constexpr才可以在此处更改。例如
    static char foo[] = "abc"; // Not a constant array
    constexpr char * s = foo; // But the address is still a valid initializer.

    是一对有效的声明。

    关于c++ - 为什么要为字符串文字声明将const添加到constexpr中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61757887/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com