c++ c++11 parentheses typeinfo

¿Por qué y cómo los paréntesis adicionales cambian el tipo de expresión en C++(C++ 11)?



c++11 parentheses (1)

decltype trata sus argumentos de manera diferente dependiendo de los paréntesis adicionales.

El segundo par de paréntesis lo convierte en una expresión primaria (pero no en sí misma una expresión id o un acceso de clase-miembro), por lo que la regla especial no se aplica.

Aquí hay una discusión: ¿ Significado de los paréntesis en decltype ((c))?

¿Bajo qué circunstancias los paréntesis de agrupación adicionales rompen las cosas en C ++ (C ++ 11 específicamente)? Por razones que no son relevantes aquí, terminé en un punto con una expresión que tenía un conjunto adicional e innecesario de parentes a su alrededor, y descubrí que la función de información de tipo C ++ 11 is_same determinaba que era un tipo diferente al El mismo código sin los paréntesis. Aquí hay un ejemplo resumido del comportamiento algo desconcertante:

#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; }

Este código imprime "1001", lo que parece indicar que los parens adicionales en las dos líneas del medio hacen que la expresión sea de un tipo diferente, pero el uso de esa expresión entre paréntesis en una expresión más grande hace que sea una vez más el mismo tipo. Por otro lado, si utilizo typeid para obtener un nombre para el tipo, typeid(s) y typeid((s)) parecen producir lo mismo.

Ahora he resuelto el problema inmediato, pero aún no entiendo por qué sucede esto en primer lugar; la búsqueda de "dobles paréntesis c ++" y similares no parece mostrar nada relevante (principalmente páginas sobre sobrecarga de operadores y extensiones de compilador que solo se activan después de una palabra clave específica).

Entonces, ¿qué diablos está pasando aquí? ¿Por qué el tipo de s diferente del tipo de (s) ?