在下面的代码中
#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"]));
这是无效的函数声明,尽管如此,编译器仍将其视为此声明。这正是代码所发生的事情。编辑:
整个问题似乎是由于对C++标准中的数组声明符没有足够严格的限制而引起的。数组'size'参数的唯一要求是
constexpr
值,该值应该转换为std::size_t
(但不会在语法分析级别上进行检查,稍后再进行)。有关该检查的更多信息this关于c++ - 最烦人的解析甚至更烦人,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62518210/