c++ - 为什么以及如何额外的括号改变 C++ (C++11) 中表达式的类型?

标签 c++ c++11 parentheses typeinfo

在什么情况下额外的分组括号会破坏 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),因此不适用特殊规则。

这里有一个讨论:Significance of parentheses in decltype((c))?

关于c++ - 为什么以及如何额外的括号改变 C++ (C++11) 中表达式的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21516600/

相关文章:

c++ - 编译 C++ 代码,然后反编译它?

c++ - 转换为 std::thread 状态调用私有(private)构造函数

c++ - 强制转换尾随返回类型会导致 SFINAE 失败

c++ - 尝试在类成员初始化中使用 vector 的填充构造函数失败。怎么了?

git - 复杂的 Git 分支名称破坏了所有 Git 命令

c++ - 将 3rd 方异步 API 与 Cap'n Proto RPC 集成的好方法是什么?

c++ - R 崩溃/中止使用带有 NA 输入的 Rcpp

c++ - AccessViolationException读取从C++/CLI DLL在C++应用程序中分配的内存

Angular 5子路由向路由添加括号

python - 从列中的行中删除 '[]' 和 '()'