Типом временного является тот тип, с которым вы объявили его.
К сожалению, поскольку Oliv указывает в их ответ правила инициализации ссылки преобразуют тип в соответствие с типом ссылки, поэтому в этом случае a
фактически ссылается на const A
. Это в основном делает
using const_A = const A;
const A& a = const_A{};
Поскольку вы действительно можете создавать постоянные значения, если хотите, чтобы набор перегрузок не принимал постоянное значение, вам нужно иметь
ret_type function_name(some_type const&&) = delete;
в противном случае, если у вас есть
ret_type function_name(some_type const&)
в перегрузке установите его, тогда константа prvalue будет привязана к этому, если вы только удалите
ret_type function_name(some_type&&)
вместо этого. Вы можете видеть это работая с
struct bar{};
void foo(bar const&) { std::cout << "void foo(bar const&)\n"; }
void foo(bar&&) =delete;
using c_bar = const bar;
int main()
{
foo(c_bar{});
}
Здесь вызывается void foo(bar const&)
, поскольку c_bar{}
на самом деле const
вместо получения ошибки удаленной функции, если вы использовали foo(bar{});
. Добавление
void foo(bar const&&) = delete;
необходим для фактической остановки foo(c_bar{});
от компиляции.