【问题标题】:Can I prevent the creation of non-temporary instances of my C++ class?我可以防止创建我的 C++ 类的非临时实例吗?
【发布时间】:2020-10-05 08:03:37
【问题描述】:

我正在构建一个类似表达式的类系统。我想利用临时变量的生命周期规则来避免将确保表达式存储在一个带有不可读错误消息的巨大丑陋模板类中。

当然,如果用户巧妙地将我的一个表达式对象保存在一个变量中,他们可能会意外地创建悬空临时对象。

有没有办法阻止用户创建一个局部变量来保存我的一个表达式实例,这样他们就永远不会对他们认为已捕获但实际上只是暂时的临时变量感到惊讶?

【问题讨论】:

  • 我很确定我已经在 SO 上看到了这个问题的重复项,但我现在找不到。 IIRC,您可以使存储它变得更加困难,但如果该人足够坚定,则并非不可能。
  • 我看到一个库通过拆分变量和树表达式来解决该问题:因此,您构建了存储占位符和常量(以及子表达式)的表达式模板,然后仅在末尾应用表达式。跨度>
  • pre-c++17,您可能拥有所有构造函数私有(复制/移动可以删除)并使用 return {..}; 创建工厂方法,但保证 C++17 的复制省略打破它。

标签: c++ temporary-objects


【解决方案1】:

我不知道有什么方法可以阻止某人拥有您允许他们创建的本地类型,但您可以通过 && 对其所有成员进行限定来使其几乎无法使用。

这不会阻止滥用它的决心,因为他们总是可以std::move 它,但它应该避免意外。

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多