Gönderen Konu: built-in olmayan temporaryler [cpp]  (Okunma sayısı 9942 defa)

built-in olmayan temporaryler [cpp]

« : 19.07.2006 20:44:42 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
Bir soru daha..

Derleyici (msvc) built-in temporaryleri const olarak oluşturuyor. "int() = 3 ;"
gibi şeyler yazamıyorum (not an l-value). ıyi güzel hoş ama built-in olmayan, kendi oluşturduğum bi tipte bunu yapmıyor. "complex() = complex() ;" filan diyebiliyorum. Hatta "complex const() = complex() ;" de diyebiliyorum.

Çözüm için operator='in bi normal bi const versiyonunu yaptım. ılkini public, ikincisini private yaptığım zaman istediğim gibi çalışıyor. Bu durumda operator='e ihtiyaç duymasam bile (memberwise copy varken) =, +=, -=, *= vs bissürü member oluşturmam gerekiyor (ikişer tane). Kısaca çalışıyor ama şık değil.

Gerçi temporary'nin değiştirilmesi çok büyük bi sorun değil ama öyle bırakınca da bi şeyler eksik gibi hissediyorum.

Not: Sanmıyorum ama compiler hatası da olabilir bu. Çünkü şöyle bi şey kullandığımda çöküyor derleyici.
class A { public: A(int) {} ; } const(0) = 0 ;

Bu arada C++'ı tüm forumla birlikte öğreniyorum umarım kızmıyorsunuzdur :D

built-in olmayan temporaryler [cpp]

« Yanıtla #1 : 19.07.2006 20:48:48 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
Hmm. "complex() = complex() ;" diyebiliyorsam "complex const() = complex() ;" zaten derim, constant initialization yapıyor.

Mesele en başta temporaryleri değiştirebilmem.

built-in olmayan temporaryler [cpp]

« Yanıtla #2 : 19.07.2006 21:21:22 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
Alıntı
Originally posted by anesthetic@Jul 19 2006, 07:48 PM
Hmm. "complex() = complex() ;" diyebiliyorsam "complex const() = complex() ;" zaten derim, constant initialization yapıyor.

Mesele en başta temporaryleri değiştirebilmem.
[post=8195]Quoted post[/post]
[/b]

complex() = complex() dediginde de initialization yapiyorsun

built-in olmayan temporaryler [cpp]

« Yanıtla #3 : 19.07.2006 21:32:34 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
int() = int() diyemiyorum ama. aynı korumayı nasıl sağlarım tanımladığım tiplerde.

built-in olmayan temporaryler [cpp]

« Yanıtla #4 : 21.07.2006 11:11:58 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
Hmm cevabımı sonunda bi kitapta buldum. int() = int() diyemememin sebebi built in tiplerdeki constların aslında compile esnasında obje olmaktan çıkması. Runtime'da construct edilen bi şey olmak yerine binary içinde yer alan datalar olmaları. Ben bunu temporaryler için bi çeşit koruma zannediyordum.

built-in olmayan temporaryler [cpp]

« Yanıtla #5 : 25.07.2006 07:58:34 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
hmm ben de neden temporaryler icin boyle bir koruma ihtiyaci oldugunu merak etmistim. sonucta bu aletler gecici olarak islem sonuclarini tutmaya yarayan (fonksiyondan donme vs) zimbirtilar ve tek kullanimliklar ve tasarim acisindan neden l-value olmadiklarini anlamamistim

gcc maillistte soyle biseye rastladim. gcc develeoperlari bu hata mesajini tartismis. birisi, hata mesajinin yanlis yonlendirici oldugunu "not an l-value for built in assignment operator" falan gibi bi hale gelmesi gerektigini soylemis.