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

Я узнаю о новой функции C ++ 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. Компилятор ???)

Почему я получаю неожиданные результаты? Были ли какие-либо изменения в синтаксисе конструктора, который использует унифицированную инициализацию в 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 ==========

2

Решение

Это ошибка в компиляторе. 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} {};
3

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

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

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