在什么情况下额外的分组括号会破坏 C++(特别是 C++11)中的内容?由于与此处无关的原因,我最终得到了一个表达式,该表达式周围有一组额外的、不必要的括号,我发现 C++11 typeinfo 函数 is_same
正在确定它与没有括号的相同代码是不同的类型。这是一个令人费解的行为的简化示例:
#include <iostream>
using namespace std;
int main()
{
string s = "foo";
cout << std::is_same<decltype(s), decltype(string("foo"))>::value;
cout << std::is_same<decltype(s), decltype((s))>::value;
cout << std::is_same<decltype((s)), decltype(string("foo"))>::value;
cout << std::is_same<decltype((s)+"x"), decltype(string("foo")+"x")>::value;
return 0;
}
此代码打印“1001”,这似乎表明中间两行中多余的括号导致表达式属于不同类型,但在更大的表达式中使用带括号的表达式使其再次成为相同类型。另一方面,如果我使用 typeid 来获取类型的名称,typeid(s)
和 typeid((s))
似乎会产生相同的结果。
我现在已经解决了眼前的问题,但我仍然不明白为什么会发生这种情况;搜索“双括号 c++”之类的东西似乎没有任何相关信息(主要是关于运算符重载的页面,以及仅在特定关键字后激活的编译器扩展)。
那么:这到底是怎么回事?为什么s
的类型和(s)
的类型不同?
最佳答案
decltype
根据附加的括号对其参数进行不同的处理。
第二对括号使其成为主表达式(但其本身不是 id-expression 或 class-member-access),因此不适用特殊规则。
关于c++ - 为什么以及如何额外的括号改变 C++ (C++11) 中表达式的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21516600/