问题 怎么样'A(tmpVector);'与'A tmpVector;'相同?


这个问题 有这段代码:

A::A(const char *pc) {
    A(string(pc));
}

A::A(string s) {
    vector<string> tmpVector;
    tmpVector.push_back(s);
    A(tmpVector); // <-- error
}

// Constructor
A::A(vector<string> filePathVector) {
}

问题是 A(tmpVector); 与...冲突 vector<string> tmpVector;

error: conflicting declaration 'A  tmpVector'
error: 'tmpVector' has a previous declaration as 'std::vector<std::basic_string<char> > tmpVector'

答案 说:

这个

A(tmpVector);

与此相同

一个tmpVector; //但是已经存在一个名为tmpVector的对象

添加评论:

在这种情况下,()是多余的。

我的问题是:为什么括号多余?究竟在C ++ 11规范中究竟是什么呢?我以前没见过这个。


7274
2018-06-11 05:57


起源

它与C ++ 11无关 ideone.com/MFGKSQ - Geoffroy
密切相关 stackoverflow.com/questions/24116817/... - 101010
是的,基本上是“什么是MVP”的另一个骗局? - Bartek Banachewicz
@BartekBanachewicz真的吗?那个怎么样? - juanchopanza


答案:


来自标准的§8[dcl.decl]:

声明符具有以下语法:

declarator:
    ptr-declarator
    noptr-declarator parameters-and-qualifiers trailing-return-type
ptr-declarator:
    noptr-declarator
    ptr-operator ptr-declarator
noptr-declarator:
    declarator-id attribute-specifier-seq_opt
    noptr-declarator parameters-and-qualifiers
    noptr-declarator [ constant-expression_opt] attribute-specifier-seq_opt
    ( ptr-declarator )

(遗漏语法的余数)。

特别要注意的是

  1. 一个 ptr-declarator 是一个 declarator
  2. 形式的东西 ( ptr-declarator ) 是一个 noptr-declarator 反过来又是一个 ptr-declarator

换句话说,你可以拥有任意数量的圆括号,它仍然是一个声明符。现在,这会导致一些模糊不清的情况 T(x);,由标准的§6.8[stmt.ambig]解决:

涉及表达式语句的语法含糊不清   和声明:具有函数样式的表达式语句   显式类型转换(5.2.3),因为它最左边的子表达式可以   与第一个声明者开始的声明无法区分   (a。在这些情况下,声明是声明。

该段附带的例子直接涵盖了这种情况:

class T {
// ...
public:
    T();
    T(int);
    T(int, int);
};

T(a);        // declaration
T(*b)();     // declaration
T(c)=7;      // declaration
T(d),e,f=3;  // declaration
extern int h;
T(g)(h,2);   // declaration

15
2018-06-11 06:24



谢谢,正是我想要的。 - Remy Lebeau