Принудительные конструкторы с одним аргументом должны быть явными в С++?

По умолчанию в С++ конструктор с одним аргументом может использоваться как оператор неявного преобразования. Это можно подавить, отметив конструктор как явный.

Я бы предпочел сделать "явным" по умолчанию, так что компилятор не может молча использовать эти конструкторы для преобразования.

Есть ли способ сделать это в стандартном С++? В противном случае существует ли прагма (или аналогичная), которая будет работать в Microsoft С++ для этого? Что относительно g++ (мы его не используем, но может быть полезной информацией)?

Ответ 1

Нет, вам нужно сделать все это вручную. Это боль, но вы, конечно, должны привыкнуть к тому, чтобы создавать конструкторы с одним аргументом. Я не могу представить, какую боль вы имели бы, если бы вы нашли решение, а затем пришлось переносить код на другую платформу. Вы обычно должны уклоняться от расширений компилятора, так как это сделает код менее портативным.

Ответ 2

Если была опция прагмы или командной строки, которая по умолчанию создавала конструкторы, как бы вы объявили одно, которое не является явным? Там должен быть другой специфический для компилятора токен или прагма, чтобы можно было объявить неявный конструктор преобразования.

Ответ 3

Это может быть довольно неприятно для любого заголовка, который у вас есть. Например <vector> или любой из заголовков Boost. Это также вызовет довольно много ложных ошибок. Итак, нет, я не ожидаю, что компилятор добавит такую ​​#pragma.

Ответ 4

В компиляторах такой опции нет, насколько мне известно. Но для таких случаев есть предупреждение Lint (см. http://www.gimpel.com/lintinfo.htm).

Ответ 5

Я думаю, что ответ - нет!

Извините, это не очень конструктивный ответ. Я надеюсь, что кто-то еще может узнать больше!

Ответ 6

Нет такой опции в стандартном С++, и я не верю, что есть и в Visual Studio.

Ответ 7

Я вижу, что вопрос в 10+ лет. Теперь вы можете просто добавить explicit ключевое слово перед объявлением.