Могу ли я использовать явное с ctor списка инициализации, чтобы убедиться, что выражение вроде {a} не приводит к неожиданному неявному преобразованию? И еще одна мысль: должен Я беспокоюсь об этом? Пишу {a}
менее вероятно, будет ошибкой, чем просто a
, но с другой стороны, из кода все еще может быть неясно, что мы создаем объект посредством неявного преобразования.
class Foo
{
explicit Foo (std::initializer_list<Bar> ilist) { /*...*/}
};
Ты не можешь. Это делает привести к неожиданному неявному преобразованию.
Однако неожиданное неявное преобразование не разрешено, и компилятор отклонит вашу программу. Это, однако, не мешает компилятору выбирать или учитывать его. пример
void f(Foo);
void f(std::vector<Bar>);
int main() {
// ambiguous
f({bar1, bar2, bar3});
}
Вы, конечно, можете. Должны ли вы действительно зависеть от ситуации, хотя я думаю, что это будет в целом редкостью.