std :: string.npos有效性

时间:2011-05-30 21:29:12

标签: c++ string standards

std::string.npos是否有效? (与正确的std::string::npos相反。)

我在一个正在研究的旧项目中看到了很多,而且它不能用VS2010编译。

这是否属于标准前的日子?

3 个答案:

答案 0 :(得分:5)

曾几何时,当开发C语言时,::语法尚未发明。代码看起来像:

class X {
public:
    void f();
};

void X.f() // a dot! see D&E 2.3
{ 
}

但是,std名称空间当时不存在。因此,我怀疑std::string.npos纯粹是微软的扩展(或者是一个错误?)。它可能受旧语法的启发,可能不是。

答案 1 :(得分:3)

以前版本的MSVC很遗憾地允许通过类名和点访问任何静态成员。

#include <iostream>
struct A
{
    static int a; 
};
int A::a;
int main()
{
    std::cout << A.a;
}

MSVC9.0高兴地接受了此代码并带有警告

  

警告1警告C4832:令牌'。'是   UDT'A'之后非法

C ++标准显然不允许通过className.memberName访问静态成员(尽管 完全合法通过对象object.staticMemberName访问静态成员)。

我的常识告诉我,如果MSVC意识到这不是标准并且发出警告,那么我们可以关闭该扩展。我们转到Project Propertied -> C/C++ -> Language并将Disable Language Extensions设置为Yes。你认为有什么变化吗?当然不是,编译器仍然接受具有相同警告的非法代码。我有时想知道Disable Language Extensions实际上做了什么...

答案 2 :(得分:3)

不,std::string.npos永远不会有效,不,这不是标准前几天的事情。

我看到其他答案提到MSVC已经允许这种表示法。

但是,MSVC不是一个非常合规的编译器。例如,它允许您自由地将临时绑定到对非const的引用。再举一个例子,对于Windows GUI子系统应用程序,您必须使用没有记录良好的开关来使其接受标准main。自微软聘请Herb Sutter(以及其他我现在不记得名字的人)来修复他们的怪异编译器以来,情况有了很大改善。相对而言,它确实很棒,但从绝对意义上说,编译器仍然有点缺乏。