LINUX.ORG.RU

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

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

Я не знаю что ты делаешь, но я бы делал так.

жалуется об отсутствии версии f без аргументов.

Можешь запретить && (sizeof...(Rest) > 0)

#include <iostream>    // fo std::cout
// #include <concepts> // not needed
#include <string>      // for std::string
#include <utility>     // for std::forward
#include <type_traits> // for std::is_convertible_v

void f(const std::string& first) {
    std::cout << first << std::endl;
}

template<typename First, typename... Rest>
    requires std::is_convertible_v<First, const std::string&> 
      && (std::is_convertible_v<Rest, const std::string&> && ...)
      && (sizeof...(Rest) > 0)
void f(First&& first, Rest&&... rest) {
    f(first);
    f(std::forward<Rest>(rest)...);
}

int main() {
    f("foo", "bar");
}

https://gcc.godbolt.org/z/8bhn9MT3q

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

Я не знаю что ты делаешь, но я бы делал так.

жалуется об отсутствии версии f без аргументов.

Можешь запретить && (sizeof...(Rest) > 0)

#include <iostream>    // fo std::cout
// #include <concepts> // not needed
#include <string>      // for std::string
#include <utility>     // for std::forward
#include <type_traits> // for std::is_convertible_v

using namespace std;

void f(const std::string& first) {
    std::cout << first << std::endl;
}

template<typename First, typename... Rest>
    requires std::is_convertible_v<First, const std::string&> 
      && (std::is_convertible_v<Rest, const std::string&> && ...)
      && (sizeof...(Rest) > 0)
void f(First&& first, Rest&&... rest) {
    f(first);
    f(std::forward<Rest>(rest)...);
}

int main() {
    f("foo", "bar");
}

https://gcc.godbolt.org/z/8bhn9MT3q