私は試した:
#include <vector>
int main () {
std::vector<int> v;
int size = v.size;
}
しかし、エラーが発生しました:
cannot convert 'std::vector<int>::size' from type 'std::vector<int>::size_type (std::vector<int>::)() const noexcept' {aka 'long unsigned int (std::vector<int>::)() const noexcept'} to type 'int'
次のように式をint
にキャストします。
#include <vector>
int main () {
std::vector<int> v;
int size = (int)v.size;
}
エラーも発生します:
error: invalid use of member function 'std::vector<_Tp, _Alloc>::size_type std::vector<_Tp, _Alloc>::size() const [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]' (did you forget the '()' ?)
最後に試した:
#include <vector>
int main () {
std::vector<int> v;
int size = v.size();
}
それは私に与えた:
warning: implicit conversion loses integer precision
どうすれば修正できますか?
最初の2つのケースでは、実際にメンバー関数を呼び出すのを忘れていました(!、値ではありません)std::vector<int>::size
このように:
#include <vector>
int main () {
std::vector<int> v;
auto size = v.size();
}
3回目の電話
int size = v.size();
その関数のすべての戻り値(通常は64ビットの符号なしint)が32ビットの符号付きintとして表せるわけではないため、警告がトリガーされます。
int size = static_cast<int>(v.size());
常にきれいにコンパイルされ、std::vector::size_type
からint
への変換が意図されていることも明示的に示されます。
vector
のサイズがint
が表すことができる最大数よりも大きい場合、size
には実装定義(事実上のゴミ)値が含まれることに注意してください。