作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的代码中
#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>);
我使用的是 Not Acceptable 。
最佳答案
捕获你的椅子,因为它很有趣。您肯定知道 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"]));
这是无效的函数声明,但编译器认为它正是这个 - 声明。这正是您的代码发生的情况。
constexpr
应该转换为
std::size_t
的值(但没有在语法分析层面进行检查,稍后进行)。有关该支票的更多信息
this
关于c++ - 最烦解析更烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62518210/
我是一名优秀的程序员,十分优秀!