Почему возвращаемым типом x является St16initializer_listI iE, а возвращаемым типом 'z' является 'i' с использованием компилятора g cc -10. Разве мы не должны просто возвращать std :: initializer_list и 'int'?
typeid()
напрямую не дадут того, что вы ожидаете, они просто возвращают указанную идентификацию типа c, как записано в своем коде. Если вы хотите расшифровать то же самое, передайте его через c++filt
:
c++filt -t St16initializer_listIiE
Это приведет к тому, что вы ожидали, то есть:
std::initializer_list<int>
На z есть предупреждение: предупреждение: левый операнд оператора запятой не действует [-Wunused-value]. Тогда вторая половина результата: 2, введите: i. Как c ++ 11 интерпретирует () -инициализированный тип? Почему в z передается только последний элемент и, следовательно, z по-прежнему имеет тип int?
( )
- это инициализатор, содержащий выражение, или список выражений. Если бы вы присвоили это auto
, он бы выбрал самый последний элемент в списке выражений в качестве его типа, поскольку он будет разделен запятыми до появления последнего выражения, которое в идеале говорит auto назначать его тип для последний.
Например:
auto x = (1, 1.5L);
приведет к длинному.
auto x = (1, 1.5f);
приведет к плавающему.
auto x = (1, "string");
приведет к указателю на константный символ.
Он полностью игнорирует первое значение в инициализаторе ( )
, которое является int
.