我知道 ISO C 标准在分离翻译行为和执行行为方面做了很多工作,部分原因是为了确保交叉编译器不必携带每个目标的执行环境。
我的意思是,与正在运行的程序相比,编译器可用的信息有限。这限制了您可以在源代码中执行的操作,例如不根据函数的返回值初始化变量,如下所示:
int twice (int val) { return val * 2; }
int xyzzy = twice (7);
int main () { printf ("%d\n", xyzzy); return 0; }
我很好奇的是 C++11 中用户定义的文字如何适应这个方案。由于文字评估依赖于一个函数,因此阻止该函数执行以下操作:
- 返回一个随机值(即使基于输入,例如
42_roughly
给你一个 40 到 44 之间的值)? - 有副作用,例如更改全局变量?
必须调用函数这一事实是否意味着在编译时计算的意义上这些并不是真正的文字?
如果是这样的话,这些文字相对于任何其他函数调用的优势是什么。换句话说,为什么是:
int xyzzy = 1101_1110_b;
最好:
int xyzzy = makeBin ("1101_1110");
?