我不明白为什么会编译

问题描述 投票:51回答:3

我当然缺少一些东西,但是我不明白为什么会这样编译(同时使用g ++和clang ++):

struct A
{
};
struct B
{
};

int main()
{
  A a(B);
}

首先,B是类型...不是值。我应该如何解释此代码?

c++ syntax declaration most-vexing-parse
3个回答
55
投票

它被解释为名为a的函数的声明,该函数接受一个类型为B的参数并返回A


10
投票

此问题称为most vexing parseA a(B);行可以解释为名为a的函数的声明,该函数返回A类型的对象并采用B类型的未命名参数。

避免此问题的一种方法是使用C ++ 11中引入的统一初始化语法,该语法包括使用花括号而不是括号:A a{B};返回错误。现在,该行被解释为以B初始化的变量声明,该声明是类型而不是值。

这里是更多信息:

The Most Vexing Parse: How to Spot It and Fix It Quickly


9
投票

这只是一个函数声明,它声明a是返回A并接受一个B类型的未命名参数的函数。

这是有效的,因为在函数定义中允许使用与函数定义相反的函数声明。

© www.soinside.com 2019 - 2024. All rights reserved.