Почему и как дополнительные скобки меняют тип выражения в C ++ (C ++ 11)?

При каких обстоятельствах дополнительные групповые скобки нарушают работу C ++ (особенно C ++ 11)? По причинам, которые здесь не имеют отношения, в какой-то момент я закончил с выражением, которое содержало лишний ненужный набор скобок вокруг него, и обнаружил, что функция typeinfo C ++ 11 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)?

16

Решение

decltype трактует свои аргументы по-разному в зависимости от дополнительных скобок.

Вторая пара скобок делает его первичным выражением (но не само по себе выражением id или доступом к члену класса), поэтому специальное правило не применяется.

Вот обсуждение: Значение скобок в decltype ((c))?

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]