LINUX.ORG.RU

История изменений

Исправление kvpfs, (текущая версия) :

Глупость, всё зависит от реализации, вот на коленках сделал:

$ cat 1.cpp

#include <unordered_map>
#include <vector>
using namespace std;

template<typename T>
concept Hashable = requires(T a) {
    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
};

template <Hashable K, typename V>
class Um : public unordered_map<K, V> {
};

int main() {
        Um<vector<int>, int> m;
}

$ clang++ -std=c++20 1.cpp
1.cpp:15:2: error: constraints not satisfied for class template 'Um' [with K = std::vector<int>, V = int]
        Um<vector<int>, int> m;
        ^~~~~~~~~~~~~~~~~~~~
1.cpp:10:11: note: because 'std::vector<int>' does not satisfy 'Hashable'
template <Hashable K, typename V>
          ^
1.cpp:7:20: note: because 'std::hash<T>({})(a)' would be invalid: temporary of type '__hash_enum<std::vector<int>>' has private destructor
    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
                   ^
1 error generated.

Так что всё зависит от желания причесать libstdc++, учитывая переход на модули std либы - её и так будут причесывать, может и здесь что сдвинется.

Исходная версия kvpfs, :

Глупость, всё зависит от реализации, вот на коленках сделал:

$ cat 1.cpp

#include <unordered_map>
#include <vector>
using namespace std;

template<typename T>
concept Hashable = requires(T a) {
    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
};

template <Hashable K, typename V>
class Um : public unordered_map<K, V> {
};

int main() {
        Um<vector<int>, int> m;
}

$ clang++ -std=c++20 1.cpp
1.cpp:15:2: error: constraints not satisfied for class template 'Um' [with K = std::vector<int>, V = int]
        Um<vector<int>, int> m;
        ^~~~~~~~~~~~~~~~~~~~
1.cpp:10:11: note: because 'std::vector<int>' does not satisfy 'Hashable'
template <Hashable K, typename V>
          ^
1.cpp:7:20: note: because 'std::hash<T>({})(a)' would be invalid: temporary of type '__hash_enum<std::vector<int>>' has private destructor
    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
                   ^
1 error generated.

Так что всё зависит от желания причесать libstdc++, учитывая переход на модули std либы - её будут причесывать.