【发布时间】:2018-09-10 18:50:06
【问题描述】:
我正在阅读关于constexpr here:
constexpr说明符声明可以在编译时评估函数或变量的值。
当我第一次读到这句话时,它对我来说非常有意义。然而,最近我遇到了一些完全让我失望的代码。我在下面重构了一个简单的例子:
#include <iostream>
void MysteryFunction(int *p);
constexpr int PlusOne(int input) {
return input + 1;
}
int main() {
int i = 0;
MysteryFunction(&i);
std::cout << PlusOne(i) << std::endl;
return 0;
}
看这段代码,我无法说出PlusOne(i) 的结果应该是什么,但是它实际上可以编译! (当然链接会失败,但是g++ -std=c++11 -c会成功,不会出错。)
“可能在编译时评估函数的值”的正确解释是什么?
【问题讨论】:
-
如果你将一个非 constexpr 参数传递给
PlusOne函数,编译器不能在编译时评估它,它只是一个正常的运行-时间函数。 -
提示:“
constexpr说明符声明可以在编译时评估函数或变量的值。” -
FWIW,cppreference 不是 C++ 的“官方描述”。这是一个社区管理的 wiki,尽管它是一个高质量的 wiki。 cppreference 中的语言故意比标准本身更随意。不要将 cppreference 的声明视为具有约束力;如果您想成为语言律师,请参考标准本身(我喜欢这个网站:eel.is/c++draft)
-
我不是想成为一名语言律师,我只是来了解功能。
-
@Apollys 可悲的是,在当今的 C++ 中,这两者通常是不可分离的:P