Можно ли определить неявное поведение приведения примитивных типов? C ++ - PullRequest
0 голосов
/ 06 января 2012

Может ли пользователь определить, как примитивы разыгрываются между примитивами?Или как они приводят к пользовательским типам?(«Конструктор неявного приведения»? Yikes)

Это гипотетический вопрос, и трудно представить его использование, но, возможно, кто-то захочет повлиять на то, как целые числа приводятся к bool.

Ответы [ 3 ]

7 голосов
/ 06 января 2012

Вы не можете изменить поведение встроенных типов. Вы не можете нарушать язык таким образом, как если бы вы не могли перегрузить новый operator+ для int s, который делает что-то еще.

Язык должен быть в состоянии дать определенные базовые гарантии, чтобы можно было писать библиотеки, основанные на базовом поведении!

Вы можете преобразовать любой тип в пользовательский тип, предоставив конструктор, который можно вызывать с одним аргументом, например ::

struct Foo
{
    Foo(T const &);
    // ...
};

Теперь вы можете сказать, T x; Foo y = x; и т. Д.

Вы также можете сделать обратное и предоставить преобразования из вашего класса:

struct Foo
{
    operator S() const;
    // ...
};

Теперь вы также можете сказать, S s = y;.

2 голосов
/ 06 января 2012

Вы не можете изменить способ примитивов разыгрывать другие примитивы.
Вы можете определить, как пользовательские типы могут быть преобразованы в примитивные типы / любые типы, предоставив конструктор преобразования .

1 голос
/ 06 января 2012

Может ли пользователь определить, как примитивы разыгрываются между примитивами?

Нет. Язык не изменчив.

Или как они приводятся к пользовательским типам? («Конструктор неявного приведения»? Yikes)

Да:

struct X {
    X() {}
    X(int a) {} // implicit cast
};

X x;
x = 10; // int implicitly cast to X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...