使用 "string_view" 表示 "string" 键
Using "string_view" to represent the "string" key
当我在 protobuf 3.8.0 中使用 map<string, string> kv;
时,下一个代码有效:
std::string_view key("key");
kv[key] = "value";
在 protobuf 3.19.4 中,上述代码不起作用。
错误消息是:
error: no match for 'operator[]' (operand types are 'google::protobuf::Map<std::__cxx11::basic_string
, std::__cxx11::basic_string>' and 'std::string_view' {aka 'std::basic_string_view'})
在 3.8.0 中,Map::operator[]
声明为:
Value& operator[](const Key& k)
在您的情况下,Key
是 std::string
。 std::string_view
可转换为 std::string
,这就是代码在 3.8.0 中工作的原因。
在 3.19.4 中,Map::operator[]
声明为:
template <typename K = key_type>
T& operator[](const key_arg<K>& key)
template <
typename K = key_type,
// Disable for integral types to reduce code bloat.
typename = typename std::enable_if<!std::is_integral<K>::value>::type>
T& operator[](key_arg<K>&& key)
其中 key_arg
声明为:
template <typename LookupKey>
using key_arg = typename internal::TransparentSupport<key_type>::template key_arg<LookupKey>;
并且,在您的情况下,key_type
是 std::string
。 std::string_view
不能转换为 TransparentSupport::key_arg
,这就是代码在 3.19.4 中不起作用的原因。
当我在 protobuf 3.8.0 中使用 map<string, string> kv;
时,下一个代码有效:
std::string_view key("key");
kv[key] = "value";
在 protobuf 3.19.4 中,上述代码不起作用。
错误消息是:
error: no match for 'operator[]' (operand types are 'google::protobuf::Map<std::__cxx11::basic_string , std::__cxx11::basic_string>' and 'std::string_view' {aka 'std::basic_string_view'})
在 3.8.0 中,Map::operator[]
声明为:
Value& operator[](const Key& k)
在您的情况下,Key
是 std::string
。 std::string_view
可转换为 std::string
,这就是代码在 3.8.0 中工作的原因。
在 3.19.4 中,Map::operator[]
声明为:
template <typename K = key_type>
T& operator[](const key_arg<K>& key)
template <
typename K = key_type,
// Disable for integral types to reduce code bloat.
typename = typename std::enable_if<!std::is_integral<K>::value>::type>
T& operator[](key_arg<K>&& key)
其中 key_arg
声明为:
template <typename LookupKey>
using key_arg = typename internal::TransparentSupport<key_type>::template key_arg<LookupKey>;
并且,在您的情况下,key_type
是 std::string
。 std::string_view
不能转换为 TransparentSupport::key_arg
,这就是代码在 3.19.4 中不起作用的原因。