两个指针之间的差异是合法的 c++17 常量表达式
Is difference between two pointers legal c++17 constant expression?
根据cpp首选项部分核心常量表达式点19)两个指针之间的减法运算符在c ++ 14之前不是合法常量表达式。我可以假设以下代码是合法的 c++17 代码还是这种解释是一种滥用?
int X, Y;
template <long long V>
struct S { };
int main() {
S<&X - &Y> s;
(void)s;
}
这个问题没有实际意义。指针算术仅在属于同一数组的指针上定义,这当然不是这种情况。因此,上面的代码不是合法C++,实际上无法使用我可用的编译器进行编译。
引用
的cppref文章说
核心常量表达式是没有任何 以下之一..
7)其评估导致任何形式的核心语言的表达 (自 C++17) 未定义的行为(包括有符号整数溢出, 除以零、指针算术外数组绑定s 等)。 是否检测到标准库未定义行为是 未指定。(自C++17起)
19) 两个指针之间的减法运算符(直到 C++14)
自 c++14 以来,可能只有数组边界内的数组 ptr 算法被"合法化",并非所有指针算法
实际上,一个演示表明,即使使用 c++11(不是 c++98),数组 ptr 算术也能很好地编译。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- (C++)分析树以计算返回错误值的简单算术表达式
- 如何在c++17中制作一个模板包装器/装饰器
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 枚举环境变量的惯用C++14/C++17方法
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 计算阶乘的 C++17 倍表达式中的错误
- GCC 7 C++17支持折叠表达式
- 我可以从 C++17 折表达式中解析出单个函数吗?
- C++17 用于初始化模板类的折叠表达式的极限类型
- C++17 折表达式语法
- 两个指针之间的差异是合法的 c++17 常量表达式
- C++17中的折叠表达式-比较运算符的用例
- std::addressof作为C++17中的常量表达式
- c++ 17表达式求值顺序和std::move