最烦人的解析甚至更令人烦恼
Most vexing parse even more vexing
本文关键字:烦恼 更新时间:2023-10-16
在下面的代码中
#include <map>
#include <string>
struct P2d {
double x, y;
P2d(double x, double y) : x(x), y(y) {}
};
double bar() {
std::map<std::string, int> m;
//P2d lp = P2d(double(m["x"]), double(m["y"])); // this works
P2d lp(double(m["x"]), double(m["y"]));
return lp.x;
}
我测试的所有编译器都同意代码(未注释版本(无效,但我不明白为什么定义
P2d lp(<double>, <double>);
我使用的是不可接受的。
我记得规则是"如果它既可以是函数声明又可以是定义,那么它就是声明",但我希望如果它不能是声明,那么它应该被解释为定义而不是给出错误。
我错过了什么?
抓住你的椅子,因为它很有趣。如您所知C++允许数组函数参数。所以你可以得到这个:
void foo(double s[2], double b[2]);
这是显而易见的。一个可能的混淆步骤是替换类型和参数名称之间的空格,这也是允许的:
void foo(double(s[2]),double(b[2]));
现在您可以想象可以非常简单地完成什么 - 用const char*
替换数字.喜欢这个:
void foo(double(s["x"]),double(b["y"]));
这是无效的函数声明,但编译器将其视为正是此声明。这正是您的代码所发生的情况。
编辑: 整个问题似乎源于C++标准中对数组声明器的限制不够严格。数组"size"参数的唯一要求是constexpr
应该转换为std::size_t
的值(但不是在语法分析级别上检查的,稍后会完成(。有关此的更多信息,请查看此内容
相关文章:
- 最烦人的解析甚至更令人烦恼
- 最令人烦恼的解析会阻止在类内初始化 std::vector<int>
- C++ 当数字文字是参数时,最令人烦恼的解析?
- 大多数令人烦恼的解析,并访问阵列
- STL Scott Meyers的烦恼分析
- (为什么)这是一个令人烦恼的解析示例吗?
- C++最令人烦恼的矢量元素交换
- C++模板奇怪的语法让我烦恼
- 保留动态分配的数组而不为删除而烦恼的最佳方法
- 可以X X(T ..)导致函数声明,并具有烦恼的解析
- 大多数令人烦恼的解析都带有限定 id - 或不
- 强制将最令人烦恼的解析的歧义消除为函数声明
- 为什么要在 if 条件下进行令人烦恼的解析
- 解析python文件时出现令人烦恼的Ctrl+M问题
- C++多个包含烦恼
- 令人烦恼的C++gcc警告消息
- (c++)面向对象——用类拓展——初学者的烦恼
- 模板函数的小烦恼
- 这是一个多么令人烦恼的解析
- 最令人烦恼的解析实例与std::string和char*