如何在使用const引用的函数中禁止临时?

时间:2017-11-08 17:47:24

标签: c++ c++14 temporary

背景

让我说我有这样的事情:

struct item
{
    int x;
    item(int y): x(y) {}
}

class item_view
{
    const item& it;
public:
    item_view(const item& it_) : it(it_) {}

    friend std::ostream& operator<<(std::ostream& os, const item_view& view)
    {return os;} //actually is more complicated
}

我不能只重载operator<<的原因是它更人性化,并且视图用于将数据传递给SQL,因此必须转义滴答和其他一些字符。

问题:

有人可能想做这样的事情:

auto view = item_view(2);
std::cout << view;

这似乎是未定义的行为。

问题:

如何防止临时建造item_view

1 个答案:

答案 0 :(得分:8)

您可以提供额外的重载,以便更好地匹配临时对象,然后将其删除。例如:

#include <string>

void foo(const std::string &) {}
void foo(std::string &&) = delete;

int main()
{
    std::string world = "World";
    foo("Hello");   // Doesn't compile, wants to use foo(std::string &&)
    foo(world);     // Compiles
}