Рассмотрим следующий код.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 по значениям параметров по умолчанию?
Спасибо.
конструктор копирования и конструктор преобразования от 'int'. – jrok
@jrok: спасибо, отредактировал – user396672
Спасибо. И что, если конструктор 'S' использовал не' Metadata() 'как значение по умолчанию для параметра' m', а конструкцию типа 'typename Metadata :: type()'? Должен ли он скомпилироваться при инстанцировании, например 'float', если значение передается для этого параметра? –