SORU
22 Aralık 2011, PERŞEMBE


Nedir &; bu" için *; rvalue başvuru"?

Bir öneri "*rvalue başvuru C 11 status page" çınlama. buna rastladım

Rvalue başvurular hakkında biraz bilgi edinin ve onları anladım, ama bu konuda ben bildiğimi sanmıyorum. Ben de web terimleri kullanarak ilgili pek fazla kaynak bulamadım.

Bu sayfa üzerinde öneri kağıt bir bağlantı var: N2439 (*hareket semantiği Uzatır), ama aynı zamanda oradan çok örnekler alamıyorum.

Bu konuda özellik nedir?

CEVAP
22 Aralık 2011, PERŞEMBE


İlk olarak, "ref-elemeleri *bu" sadece bir"". pazarlama deyimi *this tip hiç değişmiyor, bu yazının sonuna bakınız. Bu ifade ile olsa anlamak daha kolay oluyor.

Ardından, aşağıdaki kodu dayalı olarak adlandırılan bu fonksiyon seçerref-niteleyici"dolaylı nesne parametresi" işlevi:

// t.cpp
#include <iostream>

struct test{
  void f() &{ std::cout << "lvalue object\n"; }
  void f() &&{ std::cout << "rvalue object\n"; }
};

int main(){
  test t;
  t.f(); // lvalue
  test().f(); // rvalue
}

Çıkış:

$ clang   -std=c  0x -stdlib=libc   -Wall -pedantic t.cpp
$ ./a.out
lvalue object
rvalue object

Herşeyi fonksiyonu denir nesnenin bir rvalue olduğunda aslında avantaj (isimsiz geçici, örneğin) almak için izin vermek için yapılır. Bir başka örnek olarak aşağıdaki kodu atın:

struct test2{
  std::unique_ptr<int[]> heavy_resource;

  test2()
    : heavy_resource(new int[500]) {}

  operator std::unique_ptr<int[]>() const&{
    // lvalue object, deep copy
    std::unique_ptr<int[]> p(new int[500]);
    for(int i=0; i < 500;   i)
      p[i] = heavy_resource[i];

    return p;
  }

  operator std::unique_ptr<int[]>() &&{
    // rvalue object
    // we are garbage anyways, just move resource
    return std::move(heavy_resource);
  }
};

Bu biraz yapmacık olabilir, ama fikir almalısınız.

Bu birleştirebilirsiniz unutmayıncv-elemeleri(const volatile)ref-elemeleri(& &&).


Not: burada sonra Birçok standart tırnak ve aşırı çözünürlük açıklama!

† Anlamak bu işlerin nasıl ve neden @Nicol Bolas' cevabı en azından kısmen yanlış, biz kazmak C standart için biraz (bu kısmı açıklarken neden @Nicol bu cevap yanlış alt kısmında, eğer sen tek dertleri bu).

Adı ise " adında bir işlem ile belirleniraşırı çözümleme. Bu süreç sadece bizim için önemli olan bir parçaya dokunmak ederiz oldukça karmaşıktır.

İlk önemli üye fonksiyonları aşırı yükleme çözünürlüğü nasıl çalıştığını görmek için:

§13.3.1 [over.match.funcs]

p2 aday işlevleri kümesi üyesi olan ve olmayan fonksiyonları her ikisi de aynı bağımsız değişken listesiyle çözülmesi içerebilir. Bu argüman ve parametre listeleri bu heterojen set içinde karşılaştırılabilirüye işlevi hangi üye işlevi çağrıldı nesneyi temsil eden fazladan bir parametre, örtülü nesne parametresi denir ve kabul edilir. [...]

uygun olduğunda Benzer şekilde p3, içerik içeren bir bağımsız değişken listesi oluşturabilirsinizdolaylı nesne değişkeniameliyat olması gereken bir nesne belirtmek için.

Neden üye karşılaştırın ve üye olmayan fonksiyonlar için ihtiyacımız var mı? Operatör yükleme, o yüzden. Bu göz önünde bulundurun:

struct foo{
  foo& operator<<(void*); // implementation unimportant
};

foo& operator<<(foo&, char const*); // implementation unimportant

Kesinlikle ücretsiz aşağıdaki işlevi çağırmak istersin, değil mi?

char const* s = "free foo!\n";
foo f;
f << s;

Bu sözde aşırı-set dahil. Çözünürlüğü daha az karmaşık hale getirmek için, standart alıntı kalın kısmı var. Ayrıca, bu bizim için önemli bit (aynı madde):

statik olmayan üye işlev İçin p4, örtülü nesne parametre türü

  • “lvalue başvuru içincvX” fonksiyonları olmadan ilan ettiref-niteleyiciya da & ileref-niteleyici

  • “rvalue başvuru içincvX” fonksiyonları && ile ilan ettiref-niteleyici

X hangi işlevi üyesi olduğu sınıfın nerede olduğunu vecvüyenin cv-yeterlik bildirimi fonksiyonu. [...]

aşırı çözümleme Sırasında p5 [...] [t]o örtülü nesne parametre [...] dönüşüm karşılık gelen bağımsız değişken üzerinde itaat edeceksiniz bu ek kurallar beri kimliğini korur:

  • geçici nesnesi örtük nesne parametresi için bağımsız tutmak için tanıttı olabilir; ve

  • kullanıcı tanımlı dönüştürme hiç bu tip bir maç elde etmek için uygulanabilir

[...]

(Son bit sadece bir üye işlevi nesne (veya operatör) örtülü dönüşüm dayalı aşırı çözümleme denir kandıramazsın anlamına gelir.)

Hadi bu yazı ilk örnek alalım. Söz konusu dönüşüm sonra, aşırı-set şuna benzer:

void f1(test&); // will only match lvalues, linked to 'void test::f() &'
void f2(test&&); // will only match rvalues, linked to 'void test::f() &&'

Bağımsız değişkeni içeren bir listedolaylı nesne değişkeniher fonksiyonu aşırı-set içinde yer alan parametre listesi ile karşılaştırılır. Bizim durumumuzda, bağımsız değişken listesinde bağımsız değişken nesne sadece içerir. Hadi o gibi görünüyor nasıl

// first call to 'f' in 'main'
test t;
f1(t); // 't' (lvalue) can match 'test&' (lvalue reference)
       // kept in overload-set
f2(t); // 't' not an rvalue, can't match 'test&&' (rvalue reference)
       // taken out of overload-set

Setin içinde tüm aşırı test edildikten sonra, tek kalırsa, aşırı yükleme çözünürlüğü başarılı ve işlevi dönüştürülür aşırı yüklenmeye bağlı olarak adlandırılır. Aynı ikinci çağrı için gider '': . f

// second call to 'f' in 'main'
f1(test()); // 'test()' not an lvalue, can't match 'test&' (lvalue reference)
            // taken out of overload-set
f2(test()); // 'test()' (rvalue) can match 'test&&' (rvalue reference)
            // kept in overload-set

Herhangi sağladı biz unutmayınref-niteleyici(ve bu işlevi aşırı) olarak, 28**maç bir rvalue (hala §13.3.1):

[...] p5 statik olmayan üye işlev olmadan ilan edilmişref-niteleyiciek bir kural geçerlidir:

  • bile örtülü nesne parametre değil constnitelikli bir rvalue olabilir bağlı parametre olduğu sürece diğer tüm açılardan bağımsız dönüştürülebilir için bu tür örtülü nesne parametresi.
struct test{
  void f() { std::cout << "lvalue or rvalue object\n"; }
};

int main(){
  test t;
  t.f(); // OK
  test().f(); // OK too
}

@Nicol cevabı kısmen yanlış, en azından şimdi, üzerine neden. O diyor ki:

Bu beyanı *this türü değiştiğine dikkat edin.

Yanlış olan, *thisher zamanbir lvalue:

§5.3.1 [expr.unary.op] p1

* tekli işleç gerçekleştiriryönlendirme: uygulandığı ifade nesne türü veya bir işlev türü için bir işaretçi değişken olacaktırve sonucunda bir lvaluehangi ifadeyi puan nesneye atıfta ya da işlev.

§9.3.2 [class.this] p1

Statik olmayan (9.3) üye işlev gövdesinde, 37* *anahtar kelime için hangi işlevin çağrıldığı nesnenin adresi olan prvalue bir ifadesidir. Üye this tipi X X*bir sınıf işlevi. [...]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iBand IguJoo

    iBand IguJoo

    25 AĞUSTOS 2006
  • SegaAmerica

    SegaAmerica

    5 Mart 2008
  • super1988guy

    super1988guy

    9 Aralık 2007