Tại sao std::remove_const
không chuyển đổi const T&
thành T&
? Ví dụ thừa nhận chứ không phải giả tạo này chứng tỏ câu hỏi của tôi:std :: remove_const với tham chiếu const
#include <type_traits>
int main()
{
int a = 42;
std::remove_const<const int&>::type b(a);
// This assertion fails
static_assert(
!std::is_same<decltype(b), const int&>::value,
"Why did remove_const not remove const?"
);
return 0;
}
Các trường hợp trên là trivially dễ dàng để sửa chữa, do đó, bối cảnh, hãy tưởng tượng như sau:
#include <iostream>
template <typename T>
struct Selector
{
constexpr static const char* value = "default";
};
template <typename T>
struct Selector<T&>
{
constexpr static const char* value = "reference";
};
template <typename T>
struct Selector<const T&>
{
constexpr static const char* value = "constref";
};
int main()
{
std::cout
<< Selector<typename std::remove_const<const int&>::type>::value
<< std::endl;
return 0;
}
Trong ví dụ trên, tôi mong đợi reference
được hiển thị, thay vì constref
.
Hãy nhớ rằng, không có điều gì như tham chiếu const, chỉ tham chiếu đến const. – xaxxon