コンパイル時に空き関数が利用可能かどうかを検出するコンパクトな方法を実装しようとしています(例としてstd::max
を使用しています)。私がコメントアウトした場合(in Compiler Explorerを参照)(1)、検出が動作し、私のコードは、constexprの他の枝を使用しています無効な式が使用された場合、コンセプトをコンパイルできないのでしょうか?
#include <stdio.h>
#include <algorithm> // (1)
namespace std { struct max; } // (2)
template<typename A>
concept bool have_std_max = requires(A const& a1, A const& a2) {
{ std::max(a1, a2) }
};
template <typename A>
constexpr A const &my_max(A const &a1, A const &a2) {
if constexpr(have_std_max<A>) {
return std::max(a1, a2);
}
else {
return (a1 > a2) ? a1 : a2;
}
}
int main() {
int x = 5, y = 6;
return my_max(x, y);
}
:私はこれを思い付きました。ただし、(1)と(2)の両方をコメントアウトすると、std::max
という名前はコンパイラには不明なので、このコードはコンパイルできません。この場合、コンセプトは単にfalseを返してはいけませんか?ダミーを宣言することなく、同様のものを実装する方法はありますかmax
?
あなたは修飾名 'std :: max'を使用しています。私は資格がおそらく問題だと思います! *名前空間に* name *が存在しないことを示しているので、このような呼び出しの成功はテンプレート引数 'A'に依存しないので、コンパイラは' A'を知らなくても* fail *を保証することができます。しかし、修飾されていない名前は* ADLによって*検索されるかもしれません。コンパイラは 'A'が分かった後の段階に決定を延期しなければなりません。まあ、それは私の推測で、いくつかの手作りの推論です。 – Nawaz
... unqualified-nameの場合でも、名前が見つからなければ、それは*失敗するかどうか、あるいはそのコンセプトのために 'false'値になるかどうかは分かりません。 – Nawaz
@Nawazそうです、私は無条件の名前で試しましたが、実際には事前の宣言なしで動作します。 –