Был одинарный +
оператор включен только для симметрии с одинарным -
оператор, или он находит практическое применение в коде C ++?
Ища здесь, я наткнулся Какова цель унарного оператора ‘+’ в C?, но единственные полезные сценарии включают макросы препроцессора. Это полезно знать, но, похоже, они встречаются не так часто и включают в себя макросы. Есть ли случаи использования более распространенного кода на C ++?
char ch = 'a';
std::cout << ch << '\n';
std::cout << +ch << '\n';
Первая вставка пишет символ a
в cout
, Вторая вставка записывает числовое значение ch
в cout
, Но это немного неясно; он опирается на компилятор, применяющий интегральные рекламные предложения для +
оператор.
Симметрия с одинарным -
не совсем бесполезен; это может использоваться для акцента:
const int foo = -1;
const int bar = +1;
И перегруженный унарный +
может использоваться для обозначения операции, которая дает тот же логический значение в качестве его операнда, выполняя некоторые нетривиальные вычисления. (Я видел это сделано для преобразования типов в Аде, которая разрешает унарный +
, но не преобразования, чтобы быть перегруженным.) У меня нет хорошего примера C ++, и можно утверждать, что это будет плохой стиль. (Опять же, я видел много шума по поводу перегрузки <<
.)
Что касается Зачем Он есть в C ++, вероятно, в большей степени для совместимости с C, который добавил его в стандарт ANSI 1989 года. Обоснование просто говорит:
Унарный плюс был принят Комитетом С89 от нескольких
реализации, для симметрии с одинарным минусом.
Если вы явно избегаете семантики числовых значений для класса, любой очевидно, что перегрузка оператора «не делать, как делают целые». В этом случае унарный плюс может получить любое значение, делая гораздо больше, чем просто возвращение *this
Выдающийся пример: Boost.Spirit’s unary plus для встроенных EBNF Клини Плюс генерирует правило синтаксического анализатора, которое позволяет его аргументу (также правилу синтаксического анализатора) соответствовать один или несколько раз.
Одинарный +
Оператор превращает lvalue в rvalue:
struct A {
static const int value = 1;
};
// ...
int x = std::min(0, A::value);
О нет! Этот код не будет ссылаться, потому что кто-то забыл определить (а также объявить) A::value
, std::min
принимает свои аргументы по ссылке так A::value
должен иметь адрес, чтобы ссылка могла связываться с ним (технически одно правило определения гласит, что он должен быть определен в программе ровно один раз).
Фигу, унарный плюс на помощь
int x = std::min(0, +A::value);
Унарный плюс создает временное с тем же значением, а ссылка привязывается к временному, поэтому мы можем обойти отсутствующее определение.
Это не то, что вам нужно часто, но это практическое использование оператора унарный плюс.
Unary + применяет интегральные акции. Ответ @ PeteBecker показывает один способ, который может быть полезным.
Во-вторых, обратите внимание, что тип перечисления с незаданной областью увеличивается до целочисленного типа, который может представлять все значения в enum
, Так что в C ++ 03 даже без C ++ 11 std::underlying_type<T>
Вы могли бы сделать:
enum MyBitMask {
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4,
Flag4 = 0x8000000
};
inline MyBitMask operator&(MyBitMask x, MyBitMask y) {
return static_cast<MyBitMask>( +x & +y );
}
inline MyBitMask operator|(MyBitMask x, MyBitMask y) {
return static_cast<MyBitMask>( +x | +y );
}
Немного поздно, но вот очень извращенное использование, на которое я наткнулся. Видимо +
Оператор может быть полезен (если, возможно, не является строго необходимым) при разработке мер защиты от возможности обнаружения пустых токенов препроцессора. Увидеть эта почта для более глубокого обсуждения.
Это практично, но отнюдь не приятно.