2013-06-21 3 views
2

Рассмотрим следующий код.SFINAE по умолчанию значение параметра

template <typename Metadata> 
struct S { 
     double data; 
     Metadata metadata; 
     explicit S(double d = 0., Metadata const & m = Metadata()) : 
       data(d), metadata(m) 
     {} 
}; 

struct NoDefaultConstructor { 
     NoDefaultConstructor(int) {} 
}; 

struct PrivateDefaultConstructor { 
     PrivateDefaultConstructor(int) {} 
private: 
     PrivateDefaultConstructor() {} 
}; 

следующие компилируется без проблем:

S<float> sf; 

Как и ожидалось, следующие примеры кода не компилировать:

S<NoDefaultConstructor> sndc; 
S<NoDefaultConstructor> sndc(1); 
S<PrivateDefaultConstructor> spdc; 
S<PrivateDefaultConstructor> spdc(1); 

Но что о следующем:

S<NoDefaultConstructor> sndc(1, 1); 
S<PrivateDefaultConstructor> spdc(1, 1); 

Он компилирует fi ne с GCC 4.4.1, но что может сказать об этом стандарт? Должен ли я ожидать ошибку при создании шаблона S с NoDefaultConstructor или PrivateDefaultConstructor?

В общем случае, применяется ли SFINAE по значениям параметров по умолчанию?

Спасибо.

ответ

1

Он должен компилироваться отлично, потому что нет необходимости ссылаться на конструктор по умолчанию, когда второй параметр явно указан (вызывается только конструктор преобразования из конструктора int и copy).

Примечание: оно не связано с SFINAE

+0

конструктор копирования и конструктор преобразования от 'int'. – jrok

+0

@jrok: спасибо, отредактировал – user396672

+0

Спасибо. И что, если конструктор 'S' использовал не' Metadata() 'как значение по умолчанию для параметра' m', а конструкцию типа 'typename Metadata :: type()'? Должен ли он скомпилироваться при инстанцировании, например 'float', если значение передается для этого параметра? –