teorico sirve que programas programar programacion principiantes practico paso para libro ejemplos como c++ templates c++1z template-deduction

c++ - sirve - programacion c para principiantes



¿La guía de deducción de plantillas de C++ 17 no se usa para el conjunto de parámetros vacío? (1)

Este es un error de gcc (acaba de archivar 81486 ). Al deducir el success() , sintetizamos un conjunto de sobrecarga que consiste en:

// from the constructors template <class T> success<T> foo(T&& ); // looks like a forwarding reference // but is really just an rvalue reference template <class T> success<T> foo(T const& ); // from the deduction guides template <class T> success<T> foo(T ); // this one is a bit redundant success<void> foo();

Y determine el tipo de devolución como si fuera invocado como foo() , lo que sin duda debería darle un tipo de success<void> . Eso no es un error.

Considere el siguiente ejemplo reducido que también se puede ver en https://godbolt.org/g/Et56cm :

#include <utility> template <class T> struct success { T value; constexpr success(T &&v) : value(std::move(v)) { } constexpr success(const T &v) : value(v) { } }; template <> struct success<void> { }; template <class T> success(T /*unused*/)->success<T>; success()->success<void>; int main(void) { auto a = success{5}; // works auto b = success{}; // works auto c = success{"hello"}; // works auto d = success(5); // works auto e = success(); // FAILS! auto f = success("hello"); // works static_assert(std::is_same<decltype(a), success<int>>::value, ""); static_assert(std::is_same<decltype(b), success<void>>::value, ""); static_assert(std::is_same<decltype(c), success<const char *>>::value, ""); static_assert(std::is_same<decltype(d), success<int>>::value, ""); static_assert(std::is_same<decltype(e), success<void>>::value, ""); static_assert(std::is_same<decltype(f), success<const char *>>::value, ""); return 0; }

Lo que me sorprende es que success() no compila, pero el success{} sí. He proporcionado la guía de deducción de la plantilla success() -> success<void> , así que habría pensado que el success() también funcionaría.

¿Es este comportamiento esperado en el estándar C ++ 17, o me falta algo?