deque
copy(istream_iterator
上面的代码很明显是先声明了一个名为test的deque
deque
istream_iterator
copy(first, last, back_inserter(test));
再看看使用下面的语句来声明一个同样的名为test的deque
deque
我们写出上面的语句的本意与之前的本意一样,从标准输入流(cin)中读入的以空格的一个个string推入容器,直到没有更多可用的输入为止。不过我们是想通过调用deque
其实”deque
引用c++ 03标准的原话:当声明和表达式语句两者的语法形式之间可能出现二义性,即一个函数风格的显式类型转换作为其最左端的子表达式的表达式语句和一个其第一个声明子以“(”开头的声明语句可能会无法区分开。在这种情况下,该语句被解释为声明。
那么如何能够避免出现这种问题呢?
既然这是由语法形式之间的二义性导致的,那么就可以将该语句“修饰”为非法的声明的语句从而消除其二义性。而想彻底的摆脱二义性,就不要使用那些会让有些编译器误认为时声明的语法形式。一般有两种方法:
1.避免让编译器将其识别为一个函数声明,直接的做法就是:
deque
通过给参数添加额外的括号,提示编译器我们这里提供的是构造函数而非参数声明。冗余的括号使得这种形式的代码不可能被解释为合法的声明语句。
2.使用具名变量作为构造函数的参数,彻底避免声明语句产生二义性。
istream_iterator
deque
显然方法2的代码更佳清晰,而且更加便于维护。所以最好使用方法2来避免声明与语句的二义性。