порядок определения функций дает разные результаты для концепций c 20

#c #c 20 #c -concepts

#c #c 20 #c -концепции

Вопрос:

Рассмотрим эти две программы:

 #include <iostream>
#include <tuple>

void bar(int) {}

template <typename T, typename U>
void bar(std::pair<T, U>) {}

template <typename T>
concept foo = requires(const Tamp; x)
{
    { bar(x) } -> std::same_as<void>;
};

int main()
{
  std::cout << std::boolalpha;
  std::cout << foo<int> << 'n';
  std::cout << foo<std::pair<int, double>>;
}
 

и другой, где я просто переместил определение двух bar() функций после определения понятия foo :

 #include <iostream>
#include <tuple>

template <typename T>
concept foo = requires(const Tamp; x)
{
    { bar(x) } -> std::same_as<void>;
};

void bar(int) {}

template <typename T, typename U>
void bar(std::pair<T, U>) {}

int main()
{
  std::cout << std::boolalpha;
  std::cout << foo<int> << 'n';
  std::cout << foo<std::pair<int, double>>;
}
 

Первые программы печатают true для обеих функций. Однако вторая печать false .

Я не понимаю, почему он так себя ведет. Я бы исключил, что проверка существования функции bar для данного типа T происходит только тогда, когда происходит создание экземпляра концепции. Концепция не должна даже компилироваться, если она не создана.

Это определенное поведение? Мне кажется, что он использует концепцию idea, которая определяет черты, которым должен соответствовать тип, до абсурда, поскольку мне пришлось бы определять все функции перед концепцией. Это сделало бы невозможным определение концепций в библиотеке для их использования при работе с библиотекой. Я тестировал это с g v 10.2.

Комментарии:

1. Это не связано с концепцией. Двухфазный поиск по-прежнему остается двухфазным поиском