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

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

Вопрос в следующем: возможно ли в 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 */

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


person Vincent    schedule 19.02.2014    source источник
comment
Не проверял, не отправлял в качестве ответа, но, может быть... int i = 42 + (v.resize(42) || 0);   -  person isick    schedule 19.02.2014
comment
@isick C++ — это не JavaScript ;-P   -  person Brian Bi    schedule 19.02.2014
comment
Ха-ха, ясно, я не в своей тарелке. Следует оставить это специалистам по C++. Рад, что ответили   -  person isick    schedule 19.02.2014
comment
Это глупо. void() не равно нулю!   -  person Lightness Races in Orbit    schedule 19.02.2014
comment
Почему вы спрашиваете? Это сгенерированный код или внутри какого-то макроса?   -  person Basile Starynkevitch    schedule 19.02.2014
comment
(i=42) ? v.resize(42) : i ; посмотри мой пост   -  person Nikos Athanasiou    schedule 20.02.2014


Ответы (4)


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

int i = (v.resize(42), 42);
person juanchopanza    schedule 19.02.2014
comment
Возможно, есть веские причины , использовать оператор запятой ,, но это не , одна , из , их. - person Yakk - Adam Nevraumont; 19.02.2014
comment
@Yakk: Почему вы считаете, что это не лучший вариант использования оператора запятой (представьте, что он находится внутри шаблона, макроса или какого-то сгенерированного кода C++)? Конечно как рукописный код это ужасно, т.к. не очень читабельно. - person Basile Starynkevitch; 19.02.2014
comment
В шаблоне делайте это более чем одной строкой — там нет ограничений. В макросе вызовите функцию. В сгенерированном коде вызовите функцию. Как в сгенерированном коде, так и в макросах вы можете иметь вспомогательные элементы далеко от точки использования, например: template<typename C> std::size_t set_container_size( C& c, std::size_t s ) { c.resize(s); return s; }, затем int i = set_container_size(v, 42); в макросе или сгенерированном коде. Пример хорошего использования: for ограничения (увеличение двух переменных) и гимнастика до C++1y constexpr. - person Yakk - Adam Nevraumont; 19.02.2014

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

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

а с GCC вы можете использовать его выражение инструкции расширение:

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

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

int i = ([&v]() {v.resize(42); return 42;}());
person Basile Starynkevitch    schedule 19.02.2014
comment
[&]{ code } вероятно оправдано вместо [&v](){ code }. Не то, чтобы это намного лучше, чем ,! - person Yakk - Adam Nevraumont; 19.02.2014

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

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

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

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

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

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

с помощью оператора запятой.

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

v.resize(42);
int i = v.size();
person Vlad from Moscow    schedule 19.02.2014
comment
ИМХО, расширение выражения оператора GCC должно было быть добавлено в стандарт. - person Basile Starynkevitch; 19.02.2014

Не вижу смысла, но вот еще один способ

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);

Давай, этому нет конца

.....

person Nikos Athanasiou    schedule 19.02.2014