2011-05-30 4 views
5

std::string.nposがこれまでに有効でしたか? (正確なstd::string::nposとは対照的に)std :: string.npos validity

私が取り組んでいる古いプロジェクトでは多くのことを見ていますが、VS2010ではコンパイルされません。

標準より前の日からですか?クラス名とドットを介して任意の静的メンバに

答えて

3

いいえ、std::string.nposは有効ではなかった、といいえ、それは標準化前の日から何かではありません。

MSVCがその表記を許可していることを述べる他の回答があります。

ただし、MSVCはあまり準拠しないコンパイラです。たとえば、非constへの参照に一時的にバインドすることができます。別の例として、WindowsのGUIサブシステムアプリケーションでは、標準化されていないスイッチを使用して標準mainを受け入れる必要があります。マイクロソフトがHerb Sutter(と私が今の名前を覚えていない他の人)を雇って怪物のコンパイラを修理して以来、多くのものが改善されました。相対的に言えば、それは本当に素晴らしいですが、絶対的に言えば、コンパイラにはまだまだ欠けています。

+0

"たとえば、一時的に非constへの参照にバインドすることができます。コンパイラが非標準拡張を使用するための警告を出すということを「自由に」意味する限り、これは正しいです。 –

3

アクセスは、残念ながらMSVCの以前のバージョンによって許可されました。

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

このコードは喜ん警告1つの警告C4832警告

とMSVC9.0によって受け入れられる '' トークンを(それオブジェクトobject.staticMemberName介し静的メンバにアクセスする完全に合法であるが)「」

C++標準は明らかclassName.memberName介して静的メンバへのアクセスを禁止UDT後 違法です。

私の常識はMSVCが、これは標準ではないと警告を与えることを認識している場合、我々はその拡張機能をオフにすることができますことを私に伝えます。 Project Propertied -> C/C++ -> Languageに行き、Disable Language ExtensionsYesに設定します。あなたは何か変わると思いますか?もちろん、コンパイラは同じ警告で違法コードを受け入れます。私は時々、Disable Language Extensionsが実際に何をしているのだろうかと思っています...

+0

VS2005以降、 '/ Ze'は廃止され、デフォルトでは正式なので、拡張機能が常にオンになっているので、プロジェクトプロパティに表示されるテキストを変更するだけです。 – AJG85

5

時々、クラスを持つCが開発されたとき、::構文はまだ開発されていませんでした。コードは次のように見えた:

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

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

しかし、std名前空間には、当時存在していませんでした。したがって、私はstd::string.nposが純粋にMicrosoftの拡張機能(またはバグ?)であると思われます。それは古い構文に触発されているかもしれませんし、そうでないかもしれません。

+0

VS2008の約30年前にこれはありませんでしたか? –

+0

@トマラク:そうだね。したがって、私はそれが「フィーチャー」への接続を持っているのではないかと疑う。あなたは 'pre-standard C++'について尋ねたので、私が知っている情報を投稿しました。 – ybungalobill

+0

@Tomalak:もう一度考えれば可能です。 VS2005は静的メンバ変数を '.'でも受け入れます。最初のマイクロソフトのC++実装は90年代初頭にさかのぼります。 VS2010までこの機能がそのまま残っていることは実現可能です。 – ybungalobill

関連する問題