Lig*_*ica 9 c++ most-vexing-parse
考虑以下程序:
#include <fstream>
struct A {};
int main(int argc, char** argv) {
A a(std::fstream(argv[1]));
}
Run Code Online (Sandbox Code Playgroud)
Clang in C++ 1y模式估计MVP被调用,因此a被解析为函数声明:
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]));
^
( )
Run Code Online (Sandbox Code Playgroud)
我理解MVP,但不是在这个实例中:argv[1]显然是一个表达式,并且之前没有类型,所以如何将这一行解析为函数声明?
argv[1]在编译器已经选择将该行解析为函数声明之后,才会出现语义解释,它会将行消除歧义作为对象声明吗?或者它是一个Clang bug?或者通过对argv [ 1 ]我丢失的令牌的一些解释是完全正常的吗?
Meh*_*dad 13
我认为它被解析为
A a(std::fstream argv[1]);
Run Code Online (Sandbox Code Playgroud)
即一个接收1的数组的函数std::fstream,其中额外的括号是多余的.
当然,实际上,该数组参数会衰减为指针,因此您最终的语义结果是:
A a(std::fstream* argv);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |