<=> 在 c++20 之前的代码中的合法外观
Legitimate appearances of <=> in pre-c++20 code
在魔杖盒中胡闹 我发现如果 clang 看到<=>
出现在 C++17 或更早版本中,它实际上会发出警告。
warning: '<=>' is a single token in C++2a; add a space to avoid a change in behavior [-Wc++2a-compat]
我试图弄清楚如何编写 C++17 中字符序列<=>
的合法用例,但我想出的都感觉非常做作。最可能的示例 (imo) 涉及使用模板:
struct A {
bool operator<=(A) const { return true; }
};
template <auto Cmp>
void f() { }
int main() {
f<&A::operator<=>();
}
现场示例
其他所有内容仍然涉及按名称operator<=
明确提及比较函数。是否有更常见的<=>
外观,我无法想象这会促使 clang 开发人员添加此警告?
还有其他一些可能的语法不一定涉及这样的模板参数。 例如
class A {};
bool operator<=(A,A) { return true; }
class B {};
bool operator>(bool(*)(A,A), B) { return false; }
int main()
{
B b;
return operator <=> b;
}
但确实,所有这些示例在<=>
出现之前都有关键字operator
。
证明这种说法的唯一方法是对整个C++语法进行详尽的搜索,方便地显示在 C++17 标准和其他一些标准版本的附录 A 中的一个地方。
首先,请注意,由于最大蒙克规则,如果解析了先前预处理器令牌之后的下一个源字符<=>
,则 C++17 及更早版本将始终将第一个令牌视为<=
。 下一个令牌实际上可能是>
或>>
或>=
或>>=
。
涉及令牌<=
的唯一语法规则是:
折叠运算符:
<=
关系表达式:
关系表达
<=
移位表达操作员:
<=
语法符号折叠运算符仅用于:
折叠表达式:
(
投射表情折叠运算符... )
( ...
折叠运算符演员表达)
(
强制表达折叠运算符...
折叠运算符强制表达)
因此,作为折叠运算符,<=
后面必须跟有...
令牌(当然不是>
或>>
或>=
或>>=
),或者转换表达式。 无论是作为折叠运算符还是在关系表达式中,<=
标记后都可以跟着强制转换表达式或移位表达式,这两者都是受限制的表达式。 但是没有语法规则允许任何表达式以>
或>>
或>=
或>>=
开头。
这只剩下语法符号运算符,只能在以下位置找到:
运算符函数 ID:
operator
运算符
这表明关键字operator
必须紧挨着<=
,而最终可能会成为 C++20 中<=>
的一部分。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- <=> 在 c++20 之前的代码中的合法外观
- 调试C++代码:捕获第一个 NaN 外观
- 用户界面-我应该使用哪个工具包为现有的c++代码制作一个易于编辑、外观现代的GUI