LINUX.ORG.RU

История изменений

Исправление 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
}