2017-07-21 6 views
2

ので、私はこれを行うことができます:initializer_listから配列をインスタンス化できますか?

#include <iostream> 
#include <vector> 
main(){ 
    auto init = {1,2,3}; 
    std::vector<int> v(init); 
} 

を、私はこれを行うことができます:

#include <iostream> 
#include <vector> 
main(){ 
    auto init = {1,2,3}; 
    int i[3] = init; 
} 

#include <iostream> 
#include <vector> 
main(){ 
    int i[3] = {1,2,3}; 
} 

は、なぜ私はこれを行うことはできませんか?

コンパイラは私にこのことを伝えます:

main.cpp: In function 'int main()': 
main.cpp:10:16: error: array must be initialized with a brace-enclosed 
initializer 
    int i[3] = init; 
       ^~~~ 

exit status 1 

私はstd::initializer_list<int>の代わりautoinitを作成した場合、それは違いはありません。

hereと混乱することがあります。

答えて

3

auto init = {1,2,3};を入力すると、std::initialized_listとなります。これはちょうど{1,2,3}と同じではなく、braced-init-listです。 braced-init-listを集約として初期化できますが、コンストラクタを必要とするのでstd::initialized_listを使用することはできません。

+0

aahなので、 '{1,2,3}'は実際には 'std :: initializer_list'ではなく* braced-init-list *であり、' std :: initializer_listそれから。 * braced-init-list *のインスタンスを作成できますか? – will

+0

@willいいえ、あなたは* braced-init-listであるオブジェクトを持つことはできません*それらは事を初期化するためにのみ使用できます。 – NathanOliver

+0

@ここには関連性があります。https://stackoverflow.com/questions/37682392/what-is-a-curly-brace-enclosed-list-if-not-an-intializer-list – NathanOliver

関連する問題