Вызов примитивного оператора - функционирует явно в C ++

StackOverflow https://stackoverflow.com/questions/4061162

  •  27-09-2019
  •  | 
  •  

Вопрос

int a, b, c; 

//do stuff. For e.g., cin >> b >> c; 

c = a + b;          //works 
c = operator+(a,b); //fails to compile, 'operator+' not defined. 

Это с другой стороны работает -

class Foo
{
 int x; 
public:
 Foo(int x):x(x) {} 

 Foo friend operator+(const Foo& f, const Foo& g)
 {
  return Foo(f.x + g.x); 
 }

};    

Foo l(5), m(10); 

Foo n = operator+(l,m); //compiles ok! 
  • Можно ли даже вызвать оператор + (и другие операторы) примитивных типов (вроде int) напрямую?
  • Если да, как?
  • Если нет, есть ли оснесение C ++, что позволяет понять, что это не выполнимо?
Это было полезно?

Решение

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

Во-вторых, во время разрешения перегрузки встроенные операторы действительно представлены своими воображаемыми функциональными аналогами, но формулировка, которая запрещает «явную», как функциональный вызов встроенных операторов, присутствует в 13,6 / 1

Функции оператора кандидата, которые представляют встроенные операторы, определенные в пункте 5, указаны в этом подпункте. Эти кандидаты функций участвуют в процессе разрешения перегрузки оператора, как описано в 13.3.1.2 и используются без другой цели.

Другие советы

От http://www.parashift.com/c++-faq-lite/intrinsic-types.html.

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

Нет, язык C ++ требует, чтобы ваши перегрузки операторов принимали хотя бы один операнд «тип класса» или типа перечисления. Язык C ++ не позволит вам определить оператор, все операнды / параметры / параметры которых имеют примитивные типы.

Например, вы не можете определить оператор ==, который принимает два CHAR * S и использует сравнение строки. Это хорошие новости, потому что если S1 и S2 имеют тип типа Char *, выражение S1 == S2 уже имеет четко определенное значение: он сравнивает два указателя, а не две строки, указанные на эти указатели. Вы не должны использовать указатели в любом случае. Используйте std :: string вместо char *.

Если C ++, позвольте вам переопределить значение операторов в встроенных типах, вы бы никогда не знали, что 1 + 1: это будет зависеть от того, какие заголовки были включены, и будь то из тех заголовков, пересмотренных добавлением, чтобы означать, например, вычитание, например, вычитание Отказ

Стандарт C ++ §13.5.6

Функция оператора должна представлять собой нестатическую функцию элементов, либо быть функцией, не являющейся членами, либо иметь функцию, не являющейся членой и иметь хотя бы один параметр, тип которого является классом, ссылка на класс, перечисление или ссылку на перечисление. Невозможно изменить приоритет, группирование или количество операндов операторов. Значение операторов =, (unary) &, а (запятая), предопределено для каждого типа, может быть изменена для конкретных типов класса и перечисления путем определения функций оператора, которые реализуют эти операторы. Функции оператора унаследованы таким же образом, как и другие функции базового класса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top