Подтвердить что ты не робот

Как избежать "(void)" побочных эффектов, вызывающих литье?

У меня есть этот код, и GCC печатает "что!?". Как я могу избежать этого, так что пустота просто имеет значение C, означающее "Игнорировать одинокое" a? "?

#include <iostream>

struct A {
  template<typename T>
  operator T() { 
    std::cout << "what!?";
  }
};

int main() {
  A a;
  (void)a;
}
4b9b3361

Ответ 1

Как вы заметили, это ошибка в gcc. Стандарт гласит:

12.3.2. Функции преобразования [class.conv.fct]

(1) A Функция преобразования никогда не используется для преобразования объекта (возможно, cv-quali-fi) в [...] (возможно, cv-qualified) void.
116) Преобразование в void не вызывает никакой функции преобразования (5.2.9).

5.2.9 Статический литье [expr.static.cast]

(6) Любое выражение может быть явно преобразовано в тип cv void, и в этом случае оно становится отброшенным значением выражение (раздел 5).

В качестве обходного пути вы можете написать:

a, void();

Невозможно перегрузить operator,(void), поэтому существует нулевая вероятность этого вызывающего определяемого пользователем поведения из конформной реализации.

Ответ 2

Добавление

operator void() {}

заботится об этом.