私は通常、最新のC ++のサポートされている最高バージョンがC ++ 14である環境で作業します。私はc ++ 17でstd::size
fromを試していまし<iterator>
たが、次の問題/問題/私の側の理解の欠如に遭遇しました。
次のコードスニペットではsize(a)
、inの使用はmain
正しく機能しますが、inの使用はprint
、no matching function for call to 'size(int*&)'
存在することを示すコンパイルを拒否します。
これを行う他のより良い方法があることは知っていますが、なぜそれが一方のコンテキストで機能し、もう一方のコンテキストでは機能しないのかを知りたいと思います。
その価値のために、私は次のオンラインコンパイラを使用し、単に-std=c++17
フラグをオンにしました。
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
void print(int a[])
{
for(int i = 0; i < size(a); i++)
cout << a[i] << endl;
}
int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << "Directly" << endl;
for(int i = 0; i < size(a); i++)
cout << a[i] << endl;
cout << "Via function" << endl;
print(a);
return 0;
}
の最初の呼び出しでstd::size
は、この関数テンプレートシグネチャを使用します(ここで設定されたオーバーロードの#3 ):
template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept;
引数array
がポインタに減衰していない場合。これは、サイズが型にエンコードされた生の配列です。そのような配列をint[]
(またはint*
、それは問題ではない)を受け入れる関数に渡すと、配列はポインターに減衰し、サイズは型の一部ではなくなります。そのためstd::size(a)
、コンパイルできません。簡潔に:
なぜ
<iterator>
S」std::size
生の配列パラメーターで作業していませんか?
ですが、配列パラメーターではなく、ポインターを使用して使用しようとしています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加