配列を初期化するためのパラメータパックを提供しようとしています。私はそれはテンプレートだ、とsizeof
は、コンパイル時の構造なので、それは、コンパイル時に知られているべきパラメータパック Variadicテンプレート配列が未定義の動作を呼び出す
sizeof...
を使用してい
- :ので、私はそれが動作するはずだと思います
arr
を意味時間は、私が正しく
はまだ私が出力され、警告などのゴミを取得し、引数を転送するよ可変長配列
#include <iostream>
#include <utility>
template <typename... Args>
void foo(Args&&... args)
{
int arr[sizeof...(Args)]{std::forward<Args>(args)()...};
for (auto i = 0u; i < sizeof(arr); ++i)
std::cout << arr[i];
}
int a() { return 1; }
int b() { return 2; }
int c() { return 3; }
int main()
{
foo(a, b, c);
}
すると警告および出力:
warning: iteration 3 invokes undefined behavior [-Waggressive-loop-optimizations]
std::cout << arr[i];
~~~~~~~~~~^~~~~~~
note: within this loop
for (auto i = 0u; i < sizeof(arr); ++i)
~~^~~~~~~~~
1230-282327744327670000-133971368332712
誰もが私の間違いを見ることができますか?
@Caseyによるコメントで述べたように
'sizeof(arr)== sizeof ...(Args)* sizeof(int)'です。代わりに 'i
Casey
'sizeof'はサイズをバイト単位で返します。 – milleniumbug