gpt4 book ai didi

c++11 - 为什么将 int 声明为 constexpr

转载 作者:行者123 更新时间:2023-12-04 17:10:01 24 4
gpt4 key购买 nike

一边看C++11 tutorial video linked on isocpp.org我注意到一件事:

constexpr int windowWidth{800}, windowHeight{600};

声明这些有什么意义 int变量为 constexpr ,而不仅仅是 const ?

最佳答案

好视频维托里奥!

这里总结了声明 int 之间的区别constconstexpr :

int get_int();  // Some run time function that returns int

template <int N> // example use requiring a compile time int
struct test {};

const int w = get_int(); // initialized at run time
const int x = 5; // initialized at compile time
constexpr int y = get_int(); // error, can not initialize at compile time
constexpr int z = 6; // initialized at compile time

int
main()
{
test<w> tw; // error, w is not a compile time constant
test<x> tx; // ok, x is a compile time constant
test<y> ty; // error, there is no compile time constant named y
test<z> tz; // ok, z is a compile time constant
}

当您使用 constexpr ,您需要在编译时进行初始化,以免出现编译时错误。当您使用 const ,您允许初始化在运行时发生,但如果初始化程序本身是编译时常量,它仍然会在编译时发生。

如果您有 const int ,代码审查者必须查看初始化(如果这是 const int 的副本,则返回原始值)以了解是否是 const int是编译时常量,或运行时常量。

如果您有 constexpr int ,代码审查者可以立即假设它是一个编译时常量,而无需分析它是如何初始化的。如果该假设被证明是错误的,编译器会将其标记为错误。
<Disclaimer>
在下面的评论中 Kerrek SB正确地指出我在这个答案中使用术语“快速而宽松”。我这样做是为了使答案简短易懂。我所说的“在编译时初始化”和“编译时常量”是第 5.19 节“常量表达式”[expr.const] 中的标准所指的整数常量表达式。

积分常量表达式使用所谓的常量初始化进行初始化,这与零初始化一起被称为静态初始化 ([basic.start.init]/p2)。

我在这里写的与标准中出现的任何偏差都是偶然的,标准中的内容是正确的。
</Disclaimer>

关于c++11 - 为什么将 int 声明为 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20309384/

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