我可以禁止临时对象作为参数吗?

Rai*_*dex 5 c++ function visual-studio move-semantics pass-by-rvalue-reference

假设我有这个功能:

void foo(Object& o) {
    /* only query o, dont alter it*/
}
Run Code Online (Sandbox Code Playgroud)

是否可以仅使用已构造的对象调用此函数,并且如果我使用临时对象调用该函数,Visual Studio 会抛出编译错误?

struct Object {
    /*Members*/
}

void foo(Object& o) {
    /* only query o, dont alter it*/
}

int main() {
    Object o = Object();
    foo(o); // allow this
    foo(Object()) // but disallow this
}
Run Code Online (Sandbox Code Playgroud)

asm*_*mmo 10

如果您的参数不是const,则该函数将不接受临时变量。

如果您的参数是const,则该函数接受临时对象和常规对象。

但是如果你想防止这种情况,你可以使用以下

struct Object{};
void foo(const Object& o) {
    /*only query o, don't alter it*/
}
void foo(Object&& ) = delete;

int main() {
    Object o;
    foo(o); // allow this
    foo(Object{}); // but disallow this
}
Run Code Online (Sandbox Code Playgroud)

居住