Унифицированная инициализация и аргументы конструктора по умолчанию в C++11

Я узнаю о новой функции С++ 11 - унифицированной инициализации. Написал небольшую программу:

#include <iostream> 
using namespace std;

class C {
public:
    C(int a = 1, int b = 2) : a_{a}, b_{b}, n{0,1,2,3,4} {};
    int n[5];
    int a_,b_;

};

int main()
{
    C c = C{}; // should call C(int a = 1, int b = 2) with default arg.
    cout << c.a_ << "  " << c.b_ << endl;
    return 0;
}

Однако я получаю неожиданный результат 0 0. Другими словами, все инициализируется нулем. Единственным способом, которым это могло произойти: 1. Был вызван неявный конструктор по умолчанию, или 2. Неправильно была выполнена инициализация. (3. Компилятор???)

Почему я получаю неожиданные результаты? Были ли какие-либо изменения в синтаксисе конструктора, который использует инициализацию Uniform в C++11?

РЕДАКТИРОВАТЬ: Использование последнего компилятора Intel:

1>------ Rebuild All started: Project: Unif_Init (Intel C++ 13.0), Configuration: Debug Win32 ------
1>  Source.cpp
1>  xilink: executing 'link'
1>  xilink: executing 'link'
1>  Unif_Init.vcxproj -> C:\Users\alex\documents\visual studio 2012\Projects\Unif_Init\Debug\Unif_Init.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

person newprint    schedule 24.08.2013    source источник
comment
Какой компилятор? Я не могу воспроизвести с помощью gcc.   -  person Jesse Good    schedule 25.08.2013
comment
@JesseGood Компилятор Intel C++ 13   -  person newprint    schedule 25.08.2013


Ответы (1)


Это ошибка в компиляторе. C{} вызывает конструктор по умолчанию для создания временного объекта, который используется для копирования-инициализации объекта c. C(int a = 1, int b = 2), очевидно, используется по умолчанию, поэтому его следует использовать. Помогает ли переключение порядка инициализации на порядок, объявленный в классе (вероятно, нет, но только предположение)? Кажется, компилятор Intel не рассматривает ваш ctor с аргументами по умолчанию как стандартный.

C(int a = 1, int b = 2) : n{0,1,2,3,4}, a_{a}, b_{b} {};
person Jesse Good    schedule 24.08.2013
comment
Попробовал ваш вариант, тоже самое. Кроме того, я только что попробовал int* pi = new int[4] {1,2,3,4}; и получил ошибку 1>Source.cpp(18): error : expected a ";" 1> int* pi = new int[4] {1,2,3,4};//C++09 Итак, похоже, что компилятор Intel не полностью соответствует С++ 11 и имеет некоторые ошибки. В противном случае это лучший компилятор. - person newprint; 25.08.2013
comment
@JesseGood: копирует-инициализирует объект Не копирует-инициализирует объект. - person Nicol Bolas; 25.08.2013
comment
@NicolBolas: Насколько я знаю, код вызовет конструктор по умолчанию для создания временного объекта, а затем вызовет команду перемещения, чтобы переместить временный элемент в c. Я думал, что это называется copy-initialization, что я пропустил? - person Jesse Good; 26.08.2013
comment
@JesseGood: То, что вы описываете, - это инициализация копирования, но это не то, что она делает. Он выполняет прямую инициализацию списка. Нет никакого копирования. - person Nicol Bolas; 26.08.2013
comment
@NicolBolas: я думаю, что это могло быть из-за моей плохой формулировки. Да, C{} — это прямая инициализация списка, но я говорил о строке C c = C{};, где C{} инициализирует временное значение, которое затем используется для копирования-инициализации c (я обновил формулировку). - person Jesse Good; 26.08.2013