std::remove_const<std::unordered map> 似乎不起作用
std::remove_const<std::unordered map> doesn't seem to be working
void foo( const std::unordered_map<char, int> & m )
{
using M = std::remove_const< decltype( m ) >;
M mutable_map;
mutable_map['a'] = 42;
}
失败并显示“不匹配运算符[]”。在我的实际代码中,我将地图放在 std::pair
中,错误消息更清楚:“将 const std::unordered_map<...>
作为 this
丢弃限定符”。
怎么了?我不能使用 const_cast<>()
因为我不知道类型(地图模板参数)。
第一个问题是您使用的是 std::remove_const
而不是:
std::remove_const::type
或 std::remove_const_t
.
第二个问题是你需要一个值,而不是一个引用,所以你还需要丢弃一个引用,所以你需要std::decay_t
.
#include <unordered_map>
#include <type_traits>
void foo( const std::unordered_map<char, int> & m )
{
using M = std::decay_t< decltype( m ) >;
M mutable_map;
mutable_map['a'] = 42;
}
void foo( const std::unordered_map<char, int> & m )
{
using M = std::remove_const< decltype( m ) >;
M mutable_map;
mutable_map['a'] = 42;
}
失败并显示“不匹配运算符[]”。在我的实际代码中,我将地图放在 std::pair
中,错误消息更清楚:“将 const std::unordered_map<...>
作为 this
丢弃限定符”。
怎么了?我不能使用 const_cast<>()
因为我不知道类型(地图模板参数)。
第一个问题是您使用的是 std::remove_const
而不是:
std::remove_const::type
或 std::remove_const_t
.
第二个问题是你需要一个值,而不是一个引用,所以你还需要丢弃一个引用,所以你需要std::decay_t
.
#include <unordered_map>
#include <type_traits>
void foo( const std::unordered_map<char, int> & m )
{
using M = std::decay_t< decltype( m ) >;
M mutable_map;
mutable_map['a'] = 42;
}