1

私は範囲-v3ライブラリの私の読書を続けて、私はすべてのテンプレートの種類の有効な式についてのチェックは、テーリング "、42"式私はその目的が何であるのだろうか。たとえば:C++の範囲-v3の概念::末尾の "、42"で

namespace concepts { 
    constexpr struct valid_expr 
    { 
     template<typename... T> 
     void operator()(T&&...) const; 
    }; 
} 

struct ExplicitlyConvertibleTo 
{ 
    template<typename From, typename To> 
    auto requires_(From (&from)()) -> decltype(
     concepts::valid_expr(
      ((void) static_cast<To>(from()), 42) 
    )); 
}; 

私は、ボイドキャストは、カンマ演算子のいくつかの過負荷を避けるために、コンマ演算子の使用を強制するために、内側の括弧のようなその実装のポイントのいくつかを、理解などが、なぜ単に何かのようなものを書いているだけではない?

concepts::valid_expr(static_cast<To>(from())); 
+0

'concepts :: valid_expr :: operator()'が 'void'を返し、'(void、42) '式の型が' int'であるという事実に関連していますか?例えば'void'の場合と非voidの場合を扱う外部コードの2つの枝を避けるためにここでは見ていないのですか? –

答えて

5

小さな補正:範囲-V3では、valid_exprがオブジェクトではないタイプです:

constexpr struct valid_expr_t { /*...*/ } valid_expr; 

、提案どおりにconcepts::valid_expr(static_cast<To>(from()))を使用してTovoidであれば何が起こるかを検討してください。 static_castvoidまでは許されますが、引数がvoidの関数を呼び出すことはできません。