2010-04-13

Visual Studio 2010が出たけど、C++0xへの対応はお粗末すぎる

decltypeがnested-name-specifierを使えないとかもあるが、一番の問題は、ライブラリの、rvalue referenceへの対応がお粗末すぎることである。例えば、std::functonalは、rvalue referenceを正しくforwardできない。以下のコードは、VC10では、エラーである。

#include <functional>

struct Func
{
    void operator () ( int && ) const { }
} ;

int main()
{
    Func obj ;
    std::function< void ( int && ) > f( obj ) ;

    f(0) ;
}

これでは、せっかくrvalue referenceをサポートしている意味がないではないか。

Dinkumwareの実装が糞なのは、今に始まった話ではないが、一体何を考えているというのだ。コンパイラベンダーのライブラリ自らが、rvalue referenceをforwardできないとは、笑わせるつもりか。

decltypeは、つい先日、ドラフトが変わったばかりなので、仕方がないにしても、rvalue referenceは、つい最近の変更ではない。std::functionが対応していないというのは、お粗末すぎる。

結論として、VC10のC++0x対応は、まったくもってお粗末である。

だいたい、今持ってTwo Phase Lookupをサポートしていないのは、許しがたい蛮行である。これは、C++0x以前の問題だ。

struct Base
{
    void f() {} 
} ;

template < typename T >
struct Derived : T
{
    void g()
    {
        f() ;// エラーとなるべき。
    }
} ;

int main()
{
    Derived< Base > obj ;
}

5 comments:

萌ゑ said...

SP1に期待しますか。

気の長い話だけど。

江添亮 said...

マイクロソフトは、いつも遅れているんですよ。

Anonymous said...

Beta, RCと結構な期間がありましたがフィードバックを出さなかったのですか?出した結果ですか?

江添亮 said...

すくなくとも、functionに関しては出しましたよ。
答えは、「開発のスケジュール上、間に合わない」

そもそも、ライブラリの実装が、正しくforwardできてない癖に、rvalue reference対応などと謳うのが、あり得ないことなのですがね。
普通にfunctionを実装しようとすれば、すぐに気がつくはずなのに。

Two Phase Lookupに関しては、そもそも1998年の、最初の正式なC++の規格で、定義されていることなのです。
まあ、gccの対応も、完璧ではないのですが、
MSのコンパイラは、この規格を、ハナから守る気すらないということで、非常に悪名高いのです。

Anonymous said...

ようやくVS 2017でTwo-phase lookupが実装されました(オプションつきで)。
https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc