действительность std :: string.npos - PullRequest
5 голосов
/ 31 мая 2011

Был ли std::string.npos когда-либо действительным?(В отличие от правильного std::string::npos.)

Я часто вижу это в старом проекте, над которым я работаю, и он не компилируется с VS2010.

Это что-тос предстандартных дней?

Ответы [ 3 ]

5 голосов
/ 26 июня 2011

Когда-то, когда был разработан класс C с классами, синтаксис :: еще не был изобретен. Код выглядел так:

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

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

Однако, пространство имен std в те дни не существовало. Поэтому я подозреваю, что std::string.npos - это чисто расширение Microsoft (или ошибка?). Он может быть вдохновлен старым синтаксисом, а может и нет.

3 голосов
/ 28 июня 2011

Нет, std::string.npos никогда не был действительным, и нет, это не что-то из предстандартных дней.

Я вижу другие ответы, в которых упоминается, что MSVC разрешил эту запись.

Однако MSVC не очень совместимый компилятор. Например, он позволяет вам свободно привязывать временную ссылку к не-const. В качестве другого примера, для приложений подсистемы Windows GUI вы должны использовать недостаточно документированные ключи, чтобы заставить его принять стандарт main. Многое улучшилось с тех пор, как Microsoft наняла Херба Саттера (и еще одного парня, имя которого я сейчас не помню), чтобы исправить их чудовищный компилятор. И в относительном выражении это было действительно здорово, но в абсолютном выражении хорошо, что компилятору все еще немного не хватает.

3 голосов
/ 25 июня 2011

Доступ к любому статическому члену через имя класса и точку, к сожалению, был разрешен в предыдущих версиях 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

...