Арифметическая операция с пустотой?

0

Я знаю, что следующая, если возможно, будет абсолютно плохая практика, но я хочу знать, возможно ли это.

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

std::vector<int> v;
int i = 42 + v.resize(42); 
/* How to transform the last line to execute resize and to have i = 42 */

Я знаю, что это глупо, но это не вопрос...

  • 0
    Не проверял, не отправляя в качестве ответа, но, может быть ... int i = 42 + (v.resize (42) || 0);
  • 0
    @isick C ++ - это не JavaScript ;-P
Показать ещё 4 комментария
Теги:
c++11
void
arithmetic-expressions

4 ответа

6
Лучший ответ

Я не уверен, что это имеет смысл, но вы можете использовать оператор запятой здесь:

int i = (v.resize(42), 42);
  • 2
    Там , возможно , веские причины , чтобы использовать оператор запятой , но это не , один , из , них.
  • 0
    @Yakk: Почему вы считаете, что это не очень хороший вариант использования оператора запятой (представьте, что это внутри шаблона, или макроса, или какого-то сгенерированного кода C ++)? Конечно, как рукописный код, он ужасен, поскольку не очень читабелен.
Показать ещё 1 комментарий
5

Вы можете использовать запятую:

int i = (v.resize(42), 42);

и с помощью GCC вы можете использовать расширение выражения выражения:

int i = ({v.resize(42); 42;})

и в стандартном С++ 11 вы можете использовать анонимное закрытие:

int i = ([&v]() {v.resize(42); return 42;}());
  • 0
    [&]{ code } , вероятно, оправдано вместо [&v](){ code } . Не то, что это гораздо лучше , чем , !
2

Тип void не имеет значений, поэтому он не может использоваться в арифметических выражениях.

По-моему, дизайн resize члена resize. Вместо void он должен возвращать сам объект. В этом случае вы могли бы написать, например

int i = v.resize(42).size(); 

Я указал на это на форуме, где обсуждался стандарт C++.

Что касается вашего вопроса, тогда вы можете написать

int i = ( v.resize(42), v.size() );

используя оператор запятой.

Или, может быть, было бы лучше разделить эти два вызова

v.resize(42);
int i = v.size();
  • 0
    ИМХО расширение выражения оператора GCC должно было быть добавлено в стандарт.
0

Не вижу смысла, но здесь по-другому

std::tie(i, std::ignore) = std::make_tuple(42, (v.resize(42),1) );

Также вы можете сделать:

if ((i=42)) v.resize(42); 

И не забывайте

do { v.resize(42); } while (!(i=42)); 

И любимый

(i=42) ? v.resize(42) : i;

Или (единственное серьезное c++ в сообщении)

int i(0);
std::vector<int> v(i=42);

Да ладно, это не конец

.....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню