2003-12-19 [長年日記]

[Q3] STLport-4.6

エラーハンドリング周りをいじるのにあわせてSTLportを4.6に上げてみました。4.5.1からだと色々と修正されていて、CEだと通らないところも幾つかあったのでいくらかパッチを当てる必要があります。

std::unary_functionやstd::binary_functionのargument_type

STLport-4.6ではコンパイラのreturn voidバグを避けるための方法が変わっているのですが、その中に以下のようなコードがあります。

template<class _Result, class _Tp>
class _Mem_fun0_ref : public unary_function<_Tp&, _Result> {
// ...
};

つまり、unary_function::argument_typeに参照を指定しています。これだと、bind系の関数アダプタと組み合わせると、参照の参照を作ることになってしまってエラーになってしまいます。

そもそも、参照の参照がエラーにならないで単なる参照として扱ってくれればよいのですが*1、それまではargument_typeなどには参照をつけるべきなのか付けないべきなのかいつも悩むところです。意味的にはつけたほうが良いのですが、コンパイルできないのは困りますし。

とりあえず、今回はパッチで全ての参照(とconst)を外してしまって対処することにしました。

ちなみに、return voidバグとは、以下のようなコードがコンパイルエラーになってしまうバグのことです。

void f();
void g() { return f(); }

*1  次の標準ではそうなるらしい


トップ «前の日記(2003-12-18) 最新 次の日記(2003-12-20)»