Questa non è una domanda teorica, ma pratica.
C ++ supporta ciò che stai chiedendo:
[C++14: 5.16/4]:
If the second and third operands are glvalues of the same value category and have the same type, the result is of that type and value category [..]
Ad esempio:
#include <iostream>
int x = 3, y = 4;
void foo(const bool b)
{
(b ? x : y) = 6;
}
int main()
{
std::cout << x << ' ' << y << '\n'; // 3 4
foo(true);
std::cout << x << ' ' << y << '\n'; // 6 4
foo(false);
std::cout << x << ' ' << y << '\n'; // 6 6
}
( demo live )
(Questo è fondamentalmente uguale a *ptr = val
, poiché il dereferenziamento produce un lvalue.)
Vale la pena notare che C non non lo supporta:
#include <stdio.h>
#include <stdbool.h>
int x = 3, y = 4;
void foo(const bool b)
{
(b ? x : y) = 6;
}
int main()
{
printf("%d %d\n", x, y); // 3 4
foo(true);
printf("%d %d\n", x, y); // 6 4
foo(false);
printf("%d %d\n", x, y); // 6 6
}
// main.c: In function 'foo':
// main.c:8:17: error: lvalue required as left operand of assignment
// (b ? x : y) = 6;
^
( demo live )
... anche se ti permetterà di simulare questa tecnica, applicando le mie prime osservazioni riguardo alle dereferenze del puntatore:
*(b ? &x : &y) = 6;