std是否为不合格标识符?C++ Vector构造函数编译报错咨询
为什么给static_cast加std::会编译报错?
我在阅读Bjarne的《A Tour of C++(第3版)》第7章「Templates」时,参考第5章的代码实现了一个支持std::initializer_list的Vector模板类,编译时遇到了如下错误:
error: expected unqualified-id before ‘static_cast’ 47 | elem{new T[lst.size()]}, sz{std::static_cast<int>(lst.size())} ^~~~~~~~~~~
相关代码片段:
template <typename T> Vector<T>::Vector(std::initializer_list<T> lst): elem{new T[lst.size()]}, sz{std::static_cast<int>(lst.size())} { std::copy(lst.begin(), lst.end(), elem); }
我原本以为std::可以用来限定所有标准相关的标识符,但报错说std是不合格标识符。另外我发现去掉std::直接用static_cast就能正常编译,想知道这是为什么?
问题原因与解答
static_cast是C++的关键字,属于语言内置的核心特性,并非std命名空间下的标准库成员。给关键字加std::前缀完全是错误用法,编译器找不到std::static_cast这个实体,因此抛出"expected unqualified-id"的错误。- 你习惯给
std::copy、std::initializer_list这类标准库组件加std::是正确的,但像static_cast、dynamic_cast、const_cast、reinterpret_cast这类类型转换操作符,本质和if、for一样是语言关键字,不需要也不能附加命名空间限定。 - 书中示例代码不加
std::是正确写法,你之前混淆了标准库组件和语言关键字的归属,才导致了编译错误。
内容的提问来源于stack exchange,提问作者heretoinfinity
相关产品推荐
相关产品推荐

