この例を考えてみましょう。
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
int main()
{
std::string sen = "abc def ghi jkl";
std::istringstream iss(sen);
std::vector<std::string> // declaration in question
vec(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>());
std::copy(vec.begin(), vec.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
}
コンパイラは、の呼び出し時にエラーをスローしますstd::copy
request for member 'begin' in 'vec', which is of non-class type...
私はこのようなエラーを回避することができます:
std::istream_iterator<std::string> it_begin(iss);
std::istream_iterator<std::string> it_end;
std::vector<std::string> vec(it_begin, it_end);
または、次のように、各パラメータを括弧で囲みます。
std::vector<std::string>
vec((std::istream_iterator<std::string>(iss)),
(std::istream_iterator<std::string>()));
または、C++11の新しい統一初期化でも次のようになります。
std::vector<std::string> vec { /*begin*/, /*end*/ };
コンパイラが例の宣言を関数宣言として解析するのはなぜですか?私はほとんどの厄介な解析について知っていますが、それは空のパラメータリストでのみ発生すると思いました。また、2番目の回避策が機能する理由も疑問に思います。