歧义解决方案

Chu*_*dad 3 c++ declaration function object ambiguity

void S(){}
struct S{};

int main(){
   S();
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,main中的表达式'S()'被视为函数调用表达式,而不是尝试创建类型为'S'的临时表达式.

C++标准的哪一部分讨论了这种表达式的解决方案,以支持函数声明?由于某种原因,我无法找到它.

Pra*_*rav 5

第3.3.7/2节

类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的对象,函数或枚举器的名称隐藏. 如果类或枚举名称以及对象,函数或枚举器在具有相同名称的同一作用域(按任何顺序)中声明,则在对象,函数或枚举器名称可见的任何位置都会隐藏类或枚举名称.

那么在这种情况下你需要使用精心设计的类型说明符

3.4.4/1详细说明的类型说明符

精心设计的类型说明符可用于引用先前声明的类名或枚举名,即使该名称已被非类型声明隐藏(3.3.7). elaborated-type-specifier中的class-name或enum-name可以是简单的标识符,也可以是qualified-id.