【问题标题】:Deleting all lvalue conversion operators删除所有左值转换运算符
【发布时间】:2021-05-15 02:54:43
【问题描述】:

我想避免从一种类型到另一种类型的所有左值转换:

struct A
{};

struct T
{
    A a;
    operator A() { return a; }
    //operator A&() = delete; how to delete lvalue conversions to A?
};

void bar(A)
{}

void foo(const A&)
{}

void foo2(A&)
{}

int main()
{
    T t;

    bar(t); // fine
    foo(t); // should never convert to ref-to-const A
    foo2(t); // should never convert to ref-to A

    return 0;
}

这可能吗? 我需要如何删除以及删除哪些转换运算符?

godbolt 上的示例

【问题讨论】:

  • 如果不需要运算符,为什么要重载它?
  • @LazarĐorđević 他不是。值转换≠左值转换。
  • 您要解决的实际问题是什么?为什么要阻止转换为左值

标签: c++ type-conversion operators implicit-conversion


【解决方案1】:

你可能会这样做

struct T
{
    A a;
    operator A() { return a; }
    
    template <typename T> operator const T&() = delete;
};

Demo

【讨论】:

  • 太好了,谢谢!你知道为什么模板化版本有效,而不是删除所有非模板化操作符吗?
  • 与重载解析有关。 (对于bar(A)T -> AT -> const A&amp; 都是候选对象)。如果两个非模板方法之间存在平局,则调用不明确,如果模板和非模板之间存在平局,则非模板获胜。
  • 很抱歉删除已接受的答案,但请参阅stackoverflow.com/questions/66157676/…
  • c.a = t; 左值转换。所以它不会使我的答案无效:),但可能会破坏您的潜在问题:/
猜你喜欢
  • 2017-03-29
  • 1970-01-01
  • 2016-11-02
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
相关资源
最近更新 更多