C++中的括号用于许多地方:例如,在函数调用和分组表达式中,以覆盖运算符优先级.除了非法的额外括号(例如函数调用参数列表周围)之外,C++的一般但非绝对规则是额外的括号永远不会受到伤害:
5.1主要表达式[expr.prim]
5.1.1一般[expr.prim.general]
6带括号的表达式是一个主表达式,其类型和值与所附表达式的类型和值相同.括号的存在不会影响表达式是否为左值.除非另有说明,否则带括号的表达式可以在与可以使用所包含的表达式的上下文完全相同的上下文中使用,并且具有相同的含义.
问题:在哪些上下文中,额外的括号会改变C++程序的含义,而不是覆盖基本的运算符优先级?
注意:我认为没有括号的指针到成员语法的限制&qualified-id
超出了范围,因为它限制了语法而不是允许两个具有不同含义的语法.同样,在预处理程序宏定义中使用括号也可以防止不必要的运算符优先级.
我使用MinGW-w64和4.8.1(带-std = c ++ 11)并尝试在同一个类的另一个构造函数中调用我的类的一个构造函数.不幸的是,我无法编译下面的代码.
A::A(const char *pc) {
A(string(pc));
}
A::A(string s) {
vector<string> tmpVector;
tmpVector.push_back(s);
A(tmpVector);
}
// Constructor
A::A(vector<string> filePathVector) {
}
Run Code Online (Sandbox Code Playgroud)
以下是GCC抱怨的错误.
In file included from ../parser/nsn/parser.h:37:0,
from main.cpp:2:
../parser/nsn/parserimp.h: In constructor 'A::A(std::string)':
../parser/nsn/parserimp.h:522:29: error: conflicting declaration 'A tmpVector'
A(tmpVector);
^
../parser/nsn/parserimp.h:520:17: error: 'tmpVector' has a previous declaration as 'std::vector<std::basic_string<char> > tmpVector'
vector<string> tmpVector;
Run Code Online (Sandbox Code Playgroud)
我已经在C++ 11中阅读过委托的构造函数概念,但我不确定这是我追求的......
试图编译:
class AnonymousClass
{
public:
AnonymousClass(int x)
{
}
};
int main()
{
int x;
AnonymousClass(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从MSVC生成错误:
foo.cpp(13) : error C2371: 'x' : redefinition; different basic types
foo.cpp(12) : see declaration of 'x'
foo.cpp(13) : error C2512: 'AnonymousClass' : no appropriate default constructor available
Run Code Online (Sandbox Code Playgroud)
g ++的错误消息类似:
foo.cpp: In function ‘int main()’:
foo.cpp:13: error: conflicting declaration ‘AnonymousClass x’
foo.cpp:12: error: ‘x’ has a previous declaration as ‘int x’
foo.cpp:12: warning: unused variable ‘x’
Run Code Online (Sandbox Code Playgroud)
通过给AnonymousClass
对象一个明确的名称可以很容易地修复它,但是这里发生了什么以及为什么?我认为这是更多的声明语法怪异(如comp.lang.C++ FAQ的Q10.2 …