Проблема в том, что A{}
не дает вам const A
, она просто дает вам A
, поэтому вызывается 2, так как он вызывается по неконстантному значению.
Если вычтобы вызвать 4, нужно сделать const A
, и вы можете сделать это с помощью объявления псевдонима.Если у вас есть using A_const = const A;
, то A_const{}
дает вам const A
и A_const{}.f()
будет вызывать 4 вместо 2.
По сути, это static_assert(const A{}.f());
, но поскольку синтаксически вы не можете писатьТаким образом, нам нужно использовать объявление, чтобы дать нам один тип слова, который является const A
.
Кроме того, вы можете переписать
static_assert(A{}.f());
как
static_assert(std::add_const_t<A>{}.f());
, а также получите const A
значение.