Ist ein Ausdruck in noexcept
Klammern des Spezifizierers an SFINAE während der Überladungsauflösung von Funktionsvorlagen beteiligt?SFINAE und noexcept specifier
Ich möchte einen Wrapper für Aggregate machen und wollen das std::is_constructible
Prädikat richtig für sie zu arbeiten:
template< typename type >
struct embrace
: type
{
template< typename ...arguments >
embrace(arguments &&... _arguments) noexcept(noexcept(type{std::forward<arguments>(_arguments)...}))
: type{std::forward<arguments>(_arguments)...} // braces
{ ; }
};
int
main()
{
struct S { int i; double j; }; // aggregate
using E = embrace<S>;
E b(1, 1.0); // "parentheses"-constructible => can be used as usual types
b.i = 1; b.j = 2.0; // accessible
static_assert(std::is_constructible< E, int, double >{});
static_assert(std::is_constructible< E, struct B >{}); // want hard error here
return EXIT_SUCCESS;
}
Aber mein Versuch noexcept
Betreiber innerhalb noexcept
Spezifikation zu verwenden SFINAE zu ermöglichen, ist gescheitert, und das Templat-Konstruktor akzeptiert alles, was ihm übergeben wurde. Wie kann der Konstrukteur eingeschränkt werden?
Es ist vom Standard nicht gestattet, Prädikate von <type_traits>
zu spezialisieren. Wie geht man mit c-tors um, die Variant Template Packages und SFINAE generell akzeptieren? Gibt es eine Sackgasse und inhärente Sprachfehler?
Welcher Compiler ist das? – ThomasMcLeod
@ThomasMcLeod [clang 3.7] (http://coliru.stacked-crooked.com/a/46c26922bef7a4f7) – Orient
@ThomasMcLeod * g ++ * gibt frühen schweren Fehler (in C-Tor selbst und nicht ein SFINAE). – Orient