Продолжение приведения типов в C ++, которое может быть истолковано путем преобразования типов - PullRequest
4 голосов
/ 26 мая 2010

Это продолжение до моего предыдущего вопроса .

Учтите, что я пишу функцию со следующим прототипом:

int a_function(Foo val);

Где foo считается типом, определенным как unsigned int. К сожалению, это невозможно проверить из-за отсутствия документации.

Итак, кто-то приходит и использует a_function, но вызывает ее в качестве аргумента без знака int.

Здесь история разворачивается. Foo оказывается на самом деле классом, который может принимать неподписанное int как единственный аргумент unsigned int в явном конструкторе.

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

Ответы [ 3 ]

6 голосов
/ 26 мая 2010

В случае, если Foo имеет конструктор для unsigned int, неявное преобразование будет иметь место, если Foo не объявлено явным.

Первый случай:

class Foo { public: Foo(unsigned int) {} };
// ...
a_function( 1 ); // OK

Второй случай:

class Foo { public: explicit Foo(unsigned int) {} };
// ..
a_function( 1 ); // error

В соответствии со стандартом C ++ допускается только одно пользовательское неявное преобразование.

0 голосов
/ 26 мая 2010

Если конструктор explicit, то a_function(50U); приведет к ошибке компиляции, тогда как a_function(Foo(50U)); будет работать.

Эта функция на языке, предназначенная для предотвращения именно такого рода случайного преобразования.

0 голосов
/ 26 мая 2010

Да, это правильное поведение компилятора для такого преобразования типов. Если бы этого не произошло, то такие вещи, как конструкторы преобразования или неявное преобразование, были бы невозможны.

Лучше не допускать, чтобы подобные вещи происходили с помощью надлежащей практики и документации, которая, по-видимому, страдает от отсутствия вашей функции.

...