Использует ли оператор запятой odr-аргументы? - PullRequest
0 голосов
/ 19 октября 2018

Согласно определению odr-использования , объект используется odr, если к нему привязана ссылка.Вот почему, по-моему, f делает S :: x odr-used.Я не могу понять, как это отличается от оператора запятой , который также связывает свои аргументы со ссылочными параметрами

struct S {
    static const int x = 0; // static data member
    // a definition outside of class is required if it is odr-used
};
const int& f(const int& r);

int n = b ? (1, S::x) // S::x is not odr-used here
          : f(S::x);  // S::x is odr-used here: a definition is required

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Это всего лишь примеры о том, как перегруженный оператор запятой может быть определен в классе.Это использование такой перегрузки, которое обязательно вызовет использование odr, когда вы привязываетесь к аргументам.

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

Вы просто используете встроенный оператор запятой .

(Более интересным вопросом может быть, является ли самый правый операнд этого оператора все еще odr-используется, потому что из формулировка мне кажется, что это так! Помните, что нарушение использования odr не требуется для генерации ошибки сборки, и в некоторых ситуациях это не так.). *.1015 *

Я бы сказал, что страница cppreference, возможно, немного неясна в этом отношении.

0 голосов
/ 19 октября 2018

Встроенная запятая не связывает свои операнды ни с чем.

Перегруженные запятые делают, но перегруженные операторы - просто функции с забавным написанием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...