Namespaces
Variants

std:: is_convertible, std:: is_nothrow_convertible

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Défini dans l'en-tête <type_traits>
template < class From, class To >
struct is_convertible ;
(1) (depuis C++11)
template < class From, class To >
struct is_nothrow_convertible ;
(2) (depuis C++20)
1) Si la définition de fonction imaginaire To test ( ) { return std:: declval < From > ( ) ; } est bien formée (c'est-à-dire que soit std:: declval < From > ( ) peut être converti en To en utilisant les conversions implicites , soit From et To sont tous deux potentiellement qualifiés cv void ), fournit la constante membre value égale à true . Sinon, value est false . Aux fins de cette vérification, l'utilisation de std::declval dans l'instruction return n'est pas considérée comme une utilisation ODR .

Si To est un type référence et qu'un objet temporaire serait créé lors de la liaison de std:: declval < From > ( ) à To , l'instruction return dans la fonction imaginaire est considérée comme bien formée, même si une telle liaison est mal formée dans une fonction réelle.

(depuis C++26)
Access checks sont effectués comme s'ils provenaient d'un contexte sans rapport avec l'un ou l'autre type. Seule la validité du contexte immédiat de l'expression dans l'instruction return (y compris les conversions vers le type de retour) est prise en compte.
2) Identique à (1) , mais la conversion est également noexcept .

Si From ou To n'est pas un type complet, (éventuellement qualifié cv) void , ou un tableau de limite inconnue, le comportement est indéfini.

Si une instanciation d'un template ci-dessus dépend, directement ou indirectement, d'un type incomplet, et que cette instanciation pourrait produire un résultat différent si ce type était hypothétiquement complété, le comportement est indéfini.

Si le programme ajoute des spécialisations pour l'un des modèles décrits sur cette page, le comportement est indéfini.

Table des matières

Modèle de variable d'assistance

template < class From, class To >
constexpr bool is_convertible_v = is_convertible < From, To > :: value ;
(depuis C++17)
template < class From, class To >
constexpr bool is_nothrow_convertible_v = is_nothrow_convertible < From, To > :: value ;
(depuis C++20)

Hérité de std:: integral_constant

Constantes membres

value
[static]
true si From est convertible en To , false sinon
(constante membre publique statique)

Fonctions membres

operator bool
convertit l'objet en bool , retourne value
(fonction membre publique)
operator()
(C++14)
retourne value
(fonction membre publique)

Types membres

Type Définition
value_type bool
type std:: integral_constant < bool , value >

Implémentation possible

is_convertible (1)
namespace detail
{
    template<class T>
    auto test_returnable(int) -> decltype(
        void(static_cast<T(*)()>(nullptr)), std::true_type{}
    );
    template<class>
    auto test_returnable(...) -> std::false_type;
    template<class From, class To>
    auto test_implicitly_convertible(int) -> decltype(
        void(std::declval<void(&)(To)>()(std::declval<From>())), std::true_type{}
    );
    template<class, class>
    auto test_implicitly_convertible(...) -> std::false_type;
} // namespace detail
template<class From, class To>
struct is_convertible : std::integral_constant<bool,
    (decltype(detail::test_returnable<To>(0))::value &&
     decltype(detail::test_implicitly_convertible<From, To>(0))::value) ||
    (std::is_void<From>::value && std::is_void<To>::value)
> {};
is_nothrow_convertible (2)
template<class From, class To>
struct is_nothrow_convertible : std::conjunction<std::is_void<From>, std::is_void<To>> {};
template<class From, class To>
    requires
        requires
        {
            static_cast<To(*)()>(nullptr);
            { std::declval<void(&)(To) noexcept>()(std::declval<From>()) } noexcept;
        }
struct is_nothrow_convertible<From, To> : std::true_type {};

Notes

Donne des résultats bien définis pour les types référence, les types void, les types tableau et les types fonction.

Actuellement, la norme n'a pas spécifié si la destruction de l'objet produit par la conversion (soit un objet résultat, soit un temporaire lié à une référence) est considérée comme faisant partie de la conversion. Ceci est LWG issue 3400 .

Toutes les implémentations connues traitent la destruction comme faisant partie de la conversion, comme proposé dans P0758R1 .

Macro de test de fonctionnalité Valeur Norme Fonctionnalité
__cpp_lib_is_nothrow_convertible 201806L (C++20) std::is_nothrow_convertible

Exemple

#include <iomanip>
#include <iostream>
#include <string>
#include <string_view>
#include <type_traits>
class E { public: template<class T> E(T&&) {} };
int main()
{
    class A {};
    class B : public A {};
    class C {};
    class D { public: operator C() { return c; } C c; };
    static_assert(std::is_convertible_v<B*, A*>);
    static_assert(!std::is_convertible_v<A*, B*>);
    static_assert(std::is_convertible_v<D, C>);
    static_assert(!std::is_convertible_v<B*, C*>);
    // Notez que le constructeur de transfert parfait rend la classe E
    // "convertible" depuis n'importe quoi. Ainsi, A peut être remplacé par B, C, D.. :
    static_assert(std::is_convertible_v<A, E>);
    static_assert(!std::is_convertible_v<std::string_view, std::string>);
    static_assert(std::is_convertible_v<std::string, std::string_view>);
    auto stringify = []<typename T>(T x)
    {
        if constexpr (std::is_convertible_v<T, std::string> or
                      std::is_convertible_v<T, std::string_view>)
            return x;
        else
            return std::to_string(x);
    };
    using std::operator "" s, std::operator "" sv;
    const char* three = "three";
    std::cout << std::quoted(stringify("one"s)) << ' '
              << std::quoted(stringify("two"sv)) << ' '
              << std::quoted(stringify(three)) << ' '
              << std::quoted(stringify(42)) << ' '
              << std::quoted(stringify(42.0)) << '\n';
}

Sortie :

"one" "two" "three" "42" "42.000000"

Voir aussi

(C++11)
vérifie si un type est une base d'un autre type
(modèle de classe)
vérifie si un type est une base pointer-interconvertible (initiale) d'un autre type
(modèle de classe)
vérifie si les objets d'un type sont pointer-interconvertible avec le sous-objet spécifié de ce type
(modèle de fonction)
spécifie qu'un type est implicitement convertible en un autre type
(concept)