Most vexing parse

跟风秀一下

#include <iostream>

int g1() {
    return 10;
}

void main() {
    int f1(int()); //声明函数f1
    std::cout << f1(g1) << std::endl; //10

    int f2(int(*)()); //声明函数f2
    std::cout << f2(g1) << std::endl; //20

    int f3((int())); //定义变量f3,初始值是int()即0
    //std::cout << f3(g1) << std::endl;//编译不过
    std::cout << f3 << std::endl; //0

    int f4{ int() }; //定义变量f4,初始值是int()即0
    //std::cout << f4(g1) << std::endl;//编译不过
    std::cout << f4 << std::endl; //0

    system("pause");
}

int f1(int g()) {
    return g();
}

int f2(int(*g)()) {
    return 2 * g();
}

int f3(int g()) {
    return 3 * g();
}

int f4(int g()) {
    return 4 * g();
}

为什么f1是函数声明,而不是变量定义?

两个声明都是符合语法规则的。

而作为编译器,在解析时,遵循“max munch”。

如果当作变量定义,显然先解析int()是一个变量,再解析f3是一个变量

而当作函数声明,则是整个表达式

因此f1是一个函数声明

为什么f3是变量定义而不是函数声明?

如果f3是一个函数,那么参数可以省掉变量名却不能省掉变量类型

()是一个表达式,返回一个值,显然缺少变量类型,解析为函数在语法上就不正确

原文地址:https://www.cnblogs.com/sqxy110/p/5072283.html