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 ; }
SP1に期待しますか。
ReplyDelete気の長い話だけど。
マイクロソフトは、いつも遅れているんですよ。
ReplyDeleteBeta, RCと結構な期間がありましたがフィードバックを出さなかったのですか?出した結果ですか?
ReplyDeleteすくなくとも、functionに関しては出しましたよ。
ReplyDelete答えは、「開発のスケジュール上、間に合わない」
そもそも、ライブラリの実装が、正しくforwardできてない癖に、rvalue reference対応などと謳うのが、あり得ないことなのですがね。
普通にfunctionを実装しようとすれば、すぐに気がつくはずなのに。
Two Phase Lookupに関しては、そもそも1998年の、最初の正式なC++の規格で、定義されていることなのです。
まあ、gccの対応も、完璧ではないのですが、
MSのコンパイラは、この規格を、ハナから守る気すらないということで、非常に悪名高いのです。
ようやくVS 2017でTwo-phase lookupが実装されました(オプションつきで)。
ReplyDeletehttps://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc