Const void nedir?


90

Açıklama std::is_voidşunları belirtir:

T tipi void, const void, volatile void veya const volatile void ise, true değerine eşit üye sabit değerini sağlar .

O zaman ne olabilir const voidveya a volatile void?

Bu cevap , const voiddönüş türünün geçersiz olacağını belirtir (ancak VC ++ 2015'te derlenir)

const void foo() { }

Standart const voidolarak geçersizse (VC yanlışsa) - o zaman nedir const void?


15
Bağlandığınız cevap geçersiz olacağını belirtmiyor, "anlamsız" olacağını belirtiyor, ki bunu " voidolmadan üzerinde herhangi bir fayda sağlamaz" demek istiyorum const.

@hvd, yanıt derleyicinin bu tür nitelikler hakkında uyarı / hata yapması gerektiğini belirtir. Buna göre, C ++ standardının niteliklere izin vermediğini void
Ajay

2
Cevap, derleyicinin bu tür nitelikler hakkında uyarması gerektiğini, bir hatadan bahsetmediğini ve bir hatanın yanlış olacağını belirtir. Bu açıklama, uyumlulukla ilgili değil, uygulama kalitesiyle ilgili, ancak açıklamanın kendisinden bunun hiç de net olmadığını anlayabiliyorum.

@Ajay standardı, anlamsız kod kullandığınızda bir uyarı olması gerektiğini belirtmez. Bu kodun hiçbir şey yapmadığı konusunda size ek bir ipucu vermek gcc tarafından verilen bir karardı. Ancak VC hiçbir şekilde yanlış değil.
user1942027

3
@Ajay Cevap clang'ın bir uyarı verdiğini ve yazarın görüşüne göre diğer derleyicilerin bunu yapması gerektiğini belirtir. Standart buna izin vermediyse, bu bir uyarı değil, bir hata olur.
molbdnilo

Yanıtlar:


94

const voidbir işaretçi oluşturabileceğiniz bir türdür. Normal bir boşluk işaretçisine benzer, ancak dönüşümler farklı şekilde çalışır. Örneğin, a const int*örtük olarak a'ya dönüştürülemez void*, ancak örtük olarak a'ya dönüştürülebilir const void*. Eğer bir var Aynı şekilde, const void*bunu yapamazsınız static_castbir etmek int*, ama sen static_casto kadar const int*.

const int i = 10;
void* vp = &i;                           // error
const void* cvp = &i;                    // ok
auto ip = static_cast<int*>(cvp);        // error
auto cip = static_cast<const int*>(cvp); // ok

4
Cevabınız iyi olsa da, nedenini belirtmez const void, ancak tümüyle geçersiz ve geçersiz olmayan işaretçiler [sabitlik (olmayan) ile].
Ajay

26
@Ajay: Katılmıyorum. A const void*, görebileceğiniz tek nedendir const void. Bir şablon argüman olarak aktarılabilir, ancak bu argüman türü sadece *sonunda bir ile somutlaştırılacaktır .
Benjamin Lindley

Ayrıca görebilirsiniz @BenjaminLindley const voidiçinde söz dili avukat tarafından sorulan
cpplearner

3
@Ajay: Bir noktada bu soru bir felsefe sorusu haline geliyor. Bunun "nedeni", const voidC ++ 'daki tüm türlerin yapılabilmesidir const. Var olanla aynı şekilde "vardır" void. @Benjamin Lindley'in cevabı, onu gördüğünüzde ne olduğunu ve nasıl kullandığınızı açıklıyor.
Chris Beck

23

As void, const voidbir boşluk türüdür. Ancak, const voidbir dönüş türü constise anlamsızdır (yasal olsa da!), Çünkü [ifade] / 6 :

Bir prvalue başlangıçta " cv T " türüne sahipse , burada Tcv-nitelenmemiş, sınıf dışı, dizi olmayan tür ise, ifadenin türü Therhangi bir başka analizden öncekine ayarlanır .

Bununla birlikte, kendisi geçerli bir türdür ve örneğin , bağımsız değişken işaretçilerinin sabit doğruluğunu sağlamak için kullanıldığı C-standart kitaplık işlevlerinde görülür : int const*dönüştürülemez void*, ancak void const*.


const voiddönüş türü işlev türünü etkilediğinden, tamamen anlamsız değildir.
cpplearner

1
@cpplearner Her pratik anlamda olması dışında, çünkü ne işlevin imzası ne de ona yapılan bir çağrının türü etkilenmez.
Columbo

Bir işlev şablonunun imzasını değiştirebilir. +1 yine de
cpplearner

@cpplearner Yeterince adil - yine de tuş vuruşlarını boşa harcıyor.
Columbo

Normalde şunu görüyoruz: const int * void'e * gidemez, ancak const void *.
mgouin

18

Türler, şablonların sonucu olabilir; bir şablon olarak belirtilebilir const Tve Tas ile somutlaştırılabilir void.

Bağlantılı cevap yanıltıcıdır veya daha doğrusu, şablon olmayan bir türün özel durumu ile ilgili olarak görüş açısından sınırlıdır ve o zaman bile anlamsızconst void olabilir , ancak geçerli koddur .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.