Я знаю, что следующая, если возможно, будет абсолютно плохая практика, но я хочу знать, возможно ли это.
Вопрос в следующем: возможно ли в 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 */
Я знаю, что это глупо, но это не вопрос...
Я не уверен, что это имеет смысл, но вы можете использовать оператор запятой здесь:
int i = (v.resize(42), 42);
,
чтобы использовать оператор запятой ,
но это не ,
один ,
из ,
них.
Вы можете использовать запятую:
int i = (v.resize(42), 42);
и с помощью GCC вы можете использовать расширение выражения выражения:
int i = ({v.resize(42); 42;})
и в стандартном С++ 11 вы можете использовать анонимное закрытие:
int i = ([&v]() {v.resize(42); return 42;}());
[&]{ code }
, вероятно, оправдано вместо [&v](){ code }
. Не то, что это гораздо лучше , чем ,
!
Тип 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();
Не вижу смысла, но здесь по-другому
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);
Да ладно, это не конец
.....