8

次のコードを検討してください。

#include <type_traits>                                           
#include <iostream>

template <class T> concept bool C1 = std::is_same<T, int>::value; 

template <class T> concept bool C2 =  
    C1<decltype(std::declval<T>() + std::declval<T>())>; 

struct A {};                   

int main() { 
  std::cout << C2<int>; 
  std::cout << C2<A>;                                                 
  return 0;                                                           
}

GCC はそれを正常にコンパイルし、10 を出力します

しかし、 N4553の§14.10.1.2述語制約[temp.constr.pred]は言う

述語制約は、定数式 E (5.19) を評価する制約です。

その後

置換後、E は bool 型になります。

C1<decltype(std::declval<A>() + std::declval<A>())>bool型ではなく、置換の失敗なので、プログラムの形式が正しくないということですか?

4

1 に答える 1

4

コンセプト TS は、宣言の関連する制約の充足を決定するための動作のみを定義します。関連する制約の外で概念名を参照するための規定はありません。厳密に言えば、どちらも形式が正しくstd::cout << C<int>ありません。std::cout << C<A>

EWG は Kona でこれを新しい機能として許可することを決定しました。

わら投票: SF | ふ | ん | あ | SA

  • どこでも概念の評価を許可する必要がありますか? 8 | 6 | 2 | 0 | 0
  • 任意の式でrequires-expressionの存在と評価を許可する必要がありますか? 1 | 2 | 10 | 3 | 1
    • 最初のポーリングがないと、2 番目のポーリングが変更されることに注意してください。

しかし、その動作を特定する言葉遣いはまだありません。

GCC は現在、concepts-as-expressions を (文書化されていないと思いますが) 拡張機能として許可しています。のイニシャライザへの代入が有効な式の生成に失敗した場合にC<X...>評価され、それ以外の場合はそのように取得された式の値を持つように、この機能が指定される可能性が非常に高いと思います。これは、これを行うための適切な方法のように思われ、GCC での実装と一致しています。falseX...C

于 2015-12-06T00:19:15.533 に答える