Teorik olarak konuşulan tip, void
diğer dillerde unit
ya da olarak adlandırılan şeydir top
. Mantıksal eşdeğeri Doğru'dur . Herhangi bir değer yasal olarak kullanılabilir void
(her tür bir alt tipidir void
). Bunu "evren" seti olarak düşünün; dünyadaki tüm değerlerle ortak bir işlem yoktur , bu nedenle bir tür değerinde geçerli bir işlem yoktur void
. Başka bir deyişle, bir şeyin evren setine ait olduğunu söyleyerek size hiçbir bilgi vermez - zaten biliyorsunuz. Yani şu ses:
(void)5;
(void)foo(17); // whatever foo(17) does
Ancak aşağıdaki görev değil:
void raise();
void f(int y) {
int x = y!=0 ? 100/y : raise(); // raise() returns void, so what should x be?
cout << x << endl;
}
[[noreturn]]
Öte yandan, kimi kez adlandırıldığı empty
, Nothing
, Bottom
ya da Bot
ve mantıksal eşdeğeridir FALSE . Hiç değeri yoktur ve bu tipteki bir ifade herhangi bir türe çevrilebilir (yani alt tipidir). Bu boş kümedir. Birisi size "foo () ifadesinin değerinin boş kümeye ait olduğunu" söylerse , son derece bilgilendirici olduğunu - bu ifadenin asla normal yürütülmesini tamamlamayacağını söyler; iptal edecek, fırlatacak ya da asacaktır. Tam tersidir void
.
Bu yüzden aşağıdakiler mantıklı değil (pseudo-C ++, noreturn
birinci sınıf C ++ tipi olmadığından)
void foo();
(noreturn)5; // obviously a lie; the expression 5 does "return"
(noreturn)foo(); // foo() returns void, and therefore returns
Ancak aşağıdaki atama tamamen meşrudur, çünkü throw
derleyici tarafından geri dönmeyeceği anlaşılmaktadır:
void f(int y) {
int x = y!=0 ? 100/y : throw exception();
cout << x << endl;
}
Mükemmel bir dünyada, yukarıdaki noreturn
işlev için dönüş değeri olarak kullanabilirsiniz raise()
:
noreturn raise() { throw exception(); }
...
int x = y!=0 ? 100/y : raise();
Ne yazık ki C ++, muhtemelen pratik nedenlerle izin vermez. Bunun yerine, [[ noreturn ]]
derleyici optimizasyonlarına ve uyarılarına rehberlik etmeye yardımcı olan özelliği kullanma olanağı sağlar .