2015-11-26 26 views
15

参照修飾メンバ関数の株式例は、このようなもののようです。名前のない一時的な一時的なFILEポインタを直接取得することはできません。しかし、キャスト演算子をconst修飾しても、もはや動作しないように見えます。のconst参照資格のメンバ関数

異なるコンパイラは、非常に便利なアイデアですが、苦情なしに単純にそれを飲み込んでいます。たとえば、std :: string :: c_str()のメンバー関数を考えてみましょう。あなたはそれがそうでない場合、それがそうでなければあなたが無効なポインタを持っているので、それが参照資格を持つべきであると感じます。

これはC++ 11標準の穴ですか?私はここに何かを逃していますか

+4

あなたはコードをもう少し高密度にすることはできませんか? 2つのメソッドのページ以上 – user463035818

+2

'c_str()'は一時的なものであっても、パラメータ内で有用です。 'f(g()。c_str());'で、限られた有効期間はokでもかまいません。 –

+0

脇:すべてのr値の参照が一時的なものではありません。 – Hurkyl

答えて

16

テンポラリはconst&修飾オブジェクトにバインドでき、ref修飾子は暗黙的に渡されたオブジェクト(*this)を効果的に修飾します。一時的な呼び出しを防止するが、左辺値を許可する場合は、右辺参照のオーバーロードを= deleteにして、左辺値のバージョンを実装することができます。両方の演算子のためのconst修飾参照修飾子を使用するだけで実装され1つずつ= 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 
} 
+0

これは解決策のようです。私はそれが非const演算子関数を含める必要はないと思う。私はそれがなければどんな望ましくない行動もしていないようです。 –

+6

'&& = delete'の代わりに' const && = delete'を使うことができます。それ以外の場合、const rvalueは 'const&'オーバーロードに束縛されます –

+0

@PiotrSkotnicki:ありがとうございます。私はそれに応じて答えを更新しました。 –

関連する問題