История изменений
Исправление quiet_readonly, (текущая версия) :
В старом стандарте - может быть. В новом explicit действует при использовании списков инициализации, столкнулся с этим ещё год назад при работе с векторами из 2, 3, 4 координат в трассировщике лучей; с тех пор зарёкся использовать неявные конструкторы и операторы приведения к неконстантным типам. Вот минимальный пример:
#include <string>
class Delight
{
public:
Delight(int a, std::string b)
: a(a)
, b(b)
{
}
explicit Delight(int a, std::string b, std::string c)
: a(a)
, b(b + c)
{
}
private:
int a;
std::string b;
};
void foo(const Delight&)
{
}
int main()
{
foo({10, "horosho"}); /// correct
// foo({10, "horosho", "uspeh"}); /// error
}
Исходная версия quiet_readonly, :
В старом стандарте - может быть. В новом explicit действует при использовании списков инициализации, столкнулся с этим ещё год назад при работе с векторами из 2, 3, 4 координат в трассировщике лучей; с тех пор зарёкся использовать неявные конструкторы и операторы приведения к неконстантным типам. Вот минимальный пример:
#include <string>
class Delight
{
public:
Delight(int a, std::string b)
: a(a)
, b(b)
{
}
explicit Delight(int a, std::string b, std::string c)
: a(a)
, b(b + c)
{
}
private:
int a;
std::string b;
};
void foo(const Delight&)
{
}
int main()
{
foo({10, "horosho"}); /// correct
// foo({10, "horosho", "uspeh"}); /// error
}