При каких обстоятельствах дополнительные групповые скобки нарушают работу 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)
?
decltype
трактует свои аргументы по-разному в зависимости от дополнительных скобок.
Вторая пара скобок делает его первичным выражением (но не само по себе выражением id или доступом к члену класса), поэтому специальное правило не применяется.
Вот обсуждение: Значение скобок в decltype ((c))?
Других решений пока нет …