歧义解决方案

时间:2010-11-04 05:00:05

标签: c++ function object declaration ambiguity

void S(){}
struct S{};

int main(){
   S();
}

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

C ++标准的哪一部分讨论了这种表达式的解决方案,而不是函数声明?出于某种原因,我无法找到它。

2 个答案:

答案 0 :(得分:5)

第3.3.7 / 2条

  

类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的对象,函数或枚举器的名称隐藏。 如果是类或枚举名称以及对象,函数或枚举器   在具有相同名称的相同范围(以任何顺序)中声明,隐藏类或枚举名称   对象,函数或枚举器名称可见的任何地方

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

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

  

精心设计的类型说明符可用于引用先前声明的类名或枚举名甚至   虽然名称已被非类型声明隐藏(3.3.7)。中的类名或枚举名称   elaborated-type-specifier可以是简单的标识符,也可以是qualified-id。

答案 1 :(得分:0)

可以通过使用范围解析运算符(::)或使用虚拟关键字来解决(当我们处理多重或混合继承时。