const-reference合格的成员函数

时间:2015-11-26 14:24:26

标签: c++ c++11

参考资格成员函数的股票示例似乎是这样的:

// Swift
Crashlytics().debugMode = true
Fabric.with([Crashlytics.self()])

// Objective-C
[[Crashlytics sharedInstance] setDebugMode:YES];
[Fabric with:@[[Crashlytics class]]];

这很有效。无法直接从未命名的临时检索基础FILE指针。但是,如果我们使铸造操作符也符合限定条件,那么这似乎不再起作用。

不同的编译器只是吞下它而没有抱怨,即使它是一个非常有用的想法。以,例如std :: string :: c_str()成员函数为例。你觉得它应该是引用限定的(因为否则你有一个无效的指针)但它不是。

这是C ++ 11标准中的一个漏洞吗?我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:16)

临时可以绑定到const&限定对象,并且ref-qualifier有效地限定隐式传递的对象(*this)。如果要阻止对临时值的调用但允许左值,则可以= delete右值引用过载并实现左值版本。对两个运算符使用const限定的引用限定符只需要一个实现和一个= delete d实现:

class File {
    // ...
    FILE* _file;
public:
    operator FILE*() const&& = delete;
    operator FILE*() const& { return this->_file; }
    // ...
};

净效果是你只能对你进入左值的对象使用转换:

int main() {
    File       f;
    File const cf{};

    FILE* fp = f;              // OK
    FILE* cfp = cf;            // OK
    FILE* tfp = File();        // ERROR: conversion is deleted
    FILE* mfp = std::move(cf); // ERROR: conversion is deleted  
}