const voidとは何ですか?


89

の説明はstd::is_void次のように述べています。

Tがタイプvoid、const void、volatile void、またはconst volatile voidの場合、trueに等しいメンバー定数値を提供します。

それでは、、const voidまたはvolatile void

この回答は、const void戻り値の型が無効になることを示しています(ただし、VC ++ 2015でコンパイルされます)

const void foo() { }

標準でconst void無効な場合(VCが間違っている)-それでは何const voidですか?


15
あなたがにリンク答えは、それはそれは私が「上の任意の利点を提供していない意味するのにかかる「無意味」、だろうと述べて、それが無効になることな状態ではないんvoidなしconst」。

@hvd、答えはコンパイラがそのような資格について警告/エラーするべきであると述べています。それによって、C ++標準では次の資格が許可されていないと思いますvoid
Ajay 2016年

2
答えは、コンパイラーがそのような資格について警告するべきであると述べています、それはエラーについて言及していません、そしてエラーは間違っているでしょう。その発言は、適合性ではなく、実装の品質に関するものですが、発言自体からはまったく明らかではないことは理解できます。

@Ajay標準では、意味のないコードを使用したときに警告が表示されるように指定されていません。このコードは何もしないという追加のヒントを与えることはgccによる決定でした。しかし、VCは決して間違っていません。
user1942027 2016年

3
@Ajay答えは、clangが警告を出すこと、そして作者の意見では、他のコンパイラーが警告を与えるべきだと述べています。標準で許可されていない場合は、警告ではなくエラーになります。
molbdnilo 2016年

回答:


94

const voidポインタを形成できる型です。これは通常のvoidポインターに似ていますが、変換の動作が異なります。たとえば、aconst int*を暗黙的にに変換することはできませんが、暗黙的にに変換するvoid*ことはできますconst void*。同様に、あなたが持っているconst void*場合、あなたはstatic_castそれをすることはできませんint*が、あなたはstatic_castそれをすることができます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
あなたの答えは良いですが、それは理由を述べていませんconst voidが、そのすべての周りのvoidおよびnon-voidポインタ[(非)const-ness]。
Ajay 2016年

26
@Ajay:同意しません。Aconst void*はあなたが今までに見た唯一の理由ですconst void。テンプレート引数として渡される場合がありますが、その引数タイプは*、末尾にが付いている場合にのみインスタンス化されます。
ベンジャミンリンドリー2016年

また、表示される場合があり@BenjaminLindleyconst void言語の弁護士によって聞かれる質問
cpplearner

3
@Ajay:ある時点で、この質問は哲学の質問になります。の「理由」はconst void、C ++のすべての型を作成できることconstです。それは存在するのと同じ方法で「存在」しvoidます。@Benjamin Lindleyの回答は、それをいつ見たのか、どのように使用したのかを説明しています。
クリスベック

23

としてvoidconst voidはvoid型です。ただし、const void戻り値の型の場合、[expr] / 6:のconstため、は意味がありません(合法ですが!)。

prvalueのタイプが最初に「cv T」である場合T(はcvで修飾されていない非クラス、非配列タイプ)、式のタイプは、Tさらに分析する前に調整されます。

ただし、これはそれ自体が有効な型であり、たとえばC標準ライブラリ関数で発生します。引数ポインタのconst-correctnessを保証するために使用されます。にint const*変換することはできませんがvoid*void const*


const void戻り値の型は関数型に影響を与えるため、完全に無意味というわけではありません。
cpplearner 2016年

1
@cpplearner関数のシグネチャも関数の呼び出しのタイプも影響を受けないため、すべての実用的な意味である場合を除きます。
コロンボ2016年

それは関数テンプレートの署名を変更することができます。それにもかかわらず1
cpplearner

@cpplearner十分に公平ですが、それでもキーストロークの無駄です。
コロンボ2016年

通常、const int *はvoid *に移動できませんが、const void *に移動できます。
mgouin

18

タイプはテンプレートの結果である可能性があります。テンプレートはconst T、を記述し、Tとしてインスタンス化される場合がありますvoid

リンクされた回答は誤解されているか、テンプレート以外のタイプの特殊なケースを考慮しているという点で制限されており、それでも意味const voidない可能性がありますが、有効なコードです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.