2013-08-24 2 views
2

Я узнаю о новой возможности создания C++ 11. Написал небольшую программу:Uniform Инициализация и аргументы конструктора по умолчанию в 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?

EDIT: Используя последнюю версию компилятора 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 ========== 
+1

Какой компилятор? Я не могу воспроизвести gcc. –

+0

@JesseGood Компилятор Intel C++ 13 – newprint

ответ

3

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

Пробовал вашу версию, то же самое. Кроме того, я просто попробовал 'int * pi = new int [4] {1,2,3,4};' и получил ошибку '1> Source.cpp (18): error: expected a"; " 1> \t int * pi = new int [4] {1,2,3,4}; // C++ 09' Итак, похоже, что компилятор Intel не полностью дополняет C++ 11 и имеет некоторые ошибки. В противном случае это лучший компилятор. – newprint

+1

@JesseGood: «копирует-инициализирует объект». Он не копирует-инициализирует объект. –

+0

@NicolBolas: AFAIK, код будет вызывать конструктор по умолчанию для создания временного, а затем вызвать move ctor, чтобы переместить временное значение в 'c'. Я думал, что это называется 'copy-initialization', что мне не хватает? –