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:

  1. SP1に期待しますか。

    気の長い話だけど。

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

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

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

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

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

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

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.