2015-11-26 15 views
15

referans nitelikli eleman fonksiyonunun stok örneği böyle bir şey gibi görünüyor. Alttaki FILE işaretçisini doğrudan adlandırılmamış bir geçici postadan almak mümkün değildir. Bununla birlikte, döküm operatörünü de kalifiye hale getirirsek, bu artık işe yaramaz.const referans nitelikli eleman fonksiyonu

Farklı derleyiciler, oldukça yararlı bir fikir olsa bile, şikayette bulunmadan onu yutmazlar. Örneğin, std :: string :: c_str() üye işlevini kullanın. Referans nitelikli olması gerektiğini düşünüyorsanız (aksi halde geçersiz bir işaretçiniz var), henüz değil.

Bu, C++ 11 standardındaki bir delik midir? Burada bir şey mi eksik?

+4

Kodu biraz daha yoğun yapamaz mısınız? 2 yöntem için bir sayfadan daha fazlası – user463035818

+2

'c_str()', bir geçici olsa bile bir parametrede kullanışlıdır. F (g(). C_str()) 'da sınırlı ömür boyu iyi olabilir. –

+0

Yan yana: tüm r değeri referansları geçici değil. – Hurkyl

cevap

16

Geçici bir const& nitelikli nesnesine bağlanabilir ve ref-niteleyici örtülü olarak geçirilen nesneyi etkin bir şekilde nitelendirebilir (*this). Temporada çağrıları engellemek ama lvalues ​​izin vermek istiyorsanız, = delete rvalue referans aşırı yüklenebilir ve lvalue sürümünü uygulayabilirsiniz.

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 
} 
:

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

net etkisi Nesnelerin hangi bir lvalue gitmek yalnızca dönüşüm kullanabilirsiniz şudur: Her iki operatörler için const nitelikli referans eleme kullanarak sırf uygulanması ve bir tek = delete d uygulanmasını gerektirir

+0

Bu çözüm gibi görünüyor. Const olmayan operatör işlevini eklemek gerekli olduğunu sanmıyorum. Onsuz istenmeyen davranışlar görmüyorum. –

+6

'&& = delete' yerine' const && = delete' kullanabilirsiniz, aksi takdirde bir const rıhtımı 'const &' aşırı yüklenmeye neden olur –

+0

@PiotrSkotnicki: teşekkürler - Bu döngü deliğinin farkında değildim. Cevabı uygun şekilde güncelledim. –