c++11用户定义的字面量,与编译/执行二分法冲突
c++11 user defined literals, conflicts with compilation/execution dichotomy
我知道ISO C标准在区分翻译行为和执行行为方面做了很多工作,部分原因是为了确保交叉编译器不必携带每个目标的执行环境。
我的意思是,与运行中的程序相比,编译器可获得的信息有限。这限制了您在源代码中可以做的事情,例如不根据函数的返回值初始化变量,如下所示:
int twice (int val) { return val * 2; }
int xyzzy = twice (7);
int main () { printf ("%dn", xyzzy); return 0; }
我好奇的是c++ 11中的用户定义字面值是如何适应这种模式的。由于文字求值依赖于一个函数,如何阻止该函数做如下事情:
- 返回一个随机值(即使基于输入,如
42_roughly
给你40和44之间的值)? - 有副作用,比如改变全局变量?
必须调用函数的事实是否意味着这些在编译时计算的意义上不是真正的字面量?
如果是这样的话,这些字面值与其他函数调用相比有什么优势?换句话说,为什么是:
int xyzzy = 1101_1110_b;
比:
int xyzzy = makeBin ("1101_1110");
?
关键在于是否将用户定义的文字函数声明为constexpr
。
比较这个(正常的执行时间函数):
#include <iostream>
int operator "" _twice(unsigned long long num) { return num*2; }
int xyzzy = 7_twice;
int main () { std::cout << xyzzy << "n"; return 0; }
使用这个(编译时常量,static_assert
工作):
#include <iostream>
constexpr int operator "" _twice(unsigned long long num) { return num*2; }
int xyzzy = 7_twice;
int main () {
static_assert(7_twice == 14, "not compile time constant");
std::cout << xyzzy << "n";
return 0;
}
显然,声明一个函数constexpr
限制了其中的所有语句也都是constexpr
,或者是编译时常量;
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 写入位置0x0000000C时发生访问冲突
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用QProcess执行命令,并将结果存储在QStringList中
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 调用隔离后访问冲突执行位置0x0000000000000000:New()
- 执行指针时发生C++访问冲突
- VS2010 访问冲突,同时使用 F10 或 F11 单步执行代码
- 执行位置0x00000000时发生glCreateProgram访问冲突
- c++11用户定义的字面量,与编译/执行二分法冲突
- 使用函数指针C++异常:访问冲突执行位置0x00000000
- CFileException::sharing使用编译的 /clr 打开可执行文件时出现冲突
- 0xC0000005:访问冲突执行位置0x00000000.(OpenGL)