2014-06-07

もしlambda式がconstexprだったら

lambda式がconstexprでない理由、いや、より正確には、クロージャーオブジェクトの変換関数がconstexpr関数ではない理由。

もし、constexprの場合は、SFINAEの文脈で使えてしまうからだ。lambda式の本体には任意の文を書けるので、以下のような記述が可能だ。

template < typename T,
    void (*)() = [](){
// write whatever expressions that depends on T.
// if any expression is ill-formed for T, substitution fails.
}
>
void f( T ) ;

C++11の規格策定の最終段階で、クロージャーオブジェクトの関数ポインターへの変換関数をconstexprにしようという議論がでたが、当時、筆者はこのコードを示して、SFINAEの文脈で悪用可能であると示し、もって変換関数をconstexpr関数にするのを差し止めた。

これはノドから手が出るほど欲しい魅力的な悪用方法ではあるが、このような機能は、コンセプトのようなもっと洗練された言語機能で解決すべき問題だ。

2 comments:

  1. lambdaってえのは色々と不便ですね
    私たちはBlocksでいいや

    ReplyDelete
  2. コード部分がcoffeescriptになってますね

    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.