c++ - 如何防止 r 值

标签 c++ c++11

我正在创建这样的函数:

void SetItem(const Key &key, const Value &value)
{
    ...
}

其中 Key 和 Value 是某种类型。

在内部,我想像这样存储对:

std::pair<const Key &, Value>

所以这是我的问题: 我需要强制 Key 实际上是一个左值,以便在函数退出时它不会被清理(右值不安全)

我可以为函数签名:

void SetItem(Key &key, const Value &value)

这会阻止使用 r 值,但它不允许使用 const 键,我也不喜欢。

有没有办法在保持常量的情况下强制 Key 成为左值?

我可以创建一个 r 值重载来防止它:

void SetItem(Key &&key, const Value &value)
{
     [What do I put here?]
}

谢谢

最佳答案

随着评论的改进,它在完全符合 C++11 的编译器中应该看起来像这样:

class X{
public:
  void SetItem(Key const& key, Value const& value);
private:
  void SetItem(Key const&&, Value const&) = delete;
};

私有(private)重载将捕获所有 Key 右值。重载解析期间不进行访问检查,因此我们可以将其置于 private 下,这样可能的 friend 也会在编译时得到一条很好的错误消息,我们=删除它。

对于尚不支持显式删除函数的编译器,您可以将其简单地保留为未定义,但这只会显示为可能的 friend 的链接器错误。但是,一般观众会收到漂亮的“`SetItem' is inaccessible”编译器错误消息。 :)

关于c++ - 如何防止 r 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027510/

相关文章:

c++ - 为链表构建迭代器类(错误 : no matching constructor for initialization)

C++ 继承模板依赖类型

c++ - 获取轮廓的厚度

C++11 - typeid 唯一性

c++ - GetImmersiveColorTypeFromName 总是返回 -1

c++ - 使用动态分配的变量和 _chdir windows 函数时堆损坏

c++ - 奇怪的 GCC 行为

c++ - 什么样的参数可以在返回语句中自动移动?

c++11 - 结构体的大括号初始化

c++ - C++ 中是否有 'override' 说明符的反转?