【发布时间】:2014-02-07 10:12:38
【问题描述】:
考虑以下程序:
#include <fstream>
struct A {};
int main(int argc, char** argv) {
A a(std::fstream(argv[1]));
}
C++1y 模式下的 Clang 估计 MVP 被调用使得 a is parsed as a function declaration:
clang++ -std=c++1y -O3 -Wall -Wextra -pedantic-errors -pthread main.cpp && ./a.out
main.cpp:6:8: warning: parentheses were disambiguated as a function declaration [-Wvexing-parse]
A a(std::fstream(argv[1]));
^~~~~~~~~~~~~~~~~~~~~~~
main.cpp:6:9: note: add a pair of parentheses to declare a variable
A a(std::fstream(argv[1]));
^
( )
我理解 MVP,但在这种情况下不是:argv[1] 显然是一个表达式,并且它之前没有类型,那么如何将这一行解析为函数声明?
argv[1] 上的语义解释是否会在编译器已经选择将行解析为函数声明之后才会将该行作为对象声明消除歧义?或者它是一个 Clang 错误?还是通过对我缺少的标记 argv [ 1 ] 的一些解释完全正常?
【问题讨论】:
标签: c++ most-vexing-parse