web-dev-qa-db-ja.com

sizeof演算子の戻り型は何ですか?

Sizeof演算子の戻り型は何ですか? cppreference.comとmsdnは、sizeofがsize_tを返すと言います。それは本当にsize_tを返しますか? VS2010 Professionalを使用しており、x64を対象としています。

int main()
{
    int size   = sizeof(int);     // No warning
    int length = strlen("Expo");  //warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
    return 0;
}

最初の行は警告を発行していないのに、2番目の行は警告を発行しているため、この質問があります。文字サイズに変更しても、警告は表示されません。

38
Coder777

C++ 11、§5.3.3¶6

sizeofおよびsizeof...の結果は、std::size_t型の定数です。 [注:std :: size_tは、標準ヘッダー(18.2)で定義されています。 —終了ノート]

簡単な確認もできます:

#include <iostream>
#include <typeinfo>
#include <cstdlib>

int main()
{
    std::cout<<(typeid(sizeof(int))==typeid(std::size_t))<<std::endl;
    return 0;
}

これは私のマシンで1を正しく出力します。

@ Adam D. Ruppeがコメントで述べたように、おそらくコンパイラーは文句を言わない。

27
Matteo Italia

size_tは、実装定義の符号なし整数型のエイリアスです。 sizeof演算子をVLA配列に適用できるCとは反対のC++では、sizeof演算子のオペランドは(実行時に)評価されません。それは定数です。 sizeof演算子の値がint型に適合できる場合、コンパイラは警告を発行しません。 2番目の例では、std :: strlenが実行時に評価されるため、結果がintに適合しないため、コンパイラは警告を発行します。 std:; strlenを独自のconstexpr関数(一部の再帰関数)に置き換えることができます。この場合、結果がintに収まる場合、コンパイラは警告を発行しないと思います。

4

Sizeof演算子は、タイプまたは変数のサイズをバイト単位で取得するために使用されます。少なくとも16ビットの符号なし整数型を返します。移植性を得るために使用されます。

この警告は、size_tが定義されている符号なし整数のためです。

1
dpossamai