Protect against overloaded comma operators in decltype
This commit is contained in:
committed by
Victor Zverovich
parent
467520e7a4
commit
430e6ac9b6
@@ -537,14 +537,15 @@ struct parts_container_concept_check : std::true_type {
|
||||
|
||||
template <typename T> static std::false_type has_add_check(check_second);
|
||||
template <typename T>
|
||||
static decltype(declval<T>().add(declval<typename T::format_part_type>()),
|
||||
static decltype((void)declval<T>().add(
|
||||
declval<typename T::format_part_type>()),
|
||||
std::true_type()) has_add_check(check_first);
|
||||
typedef decltype(has_add_check<PartsContainer>(check_first())) has_add;
|
||||
static_assert(has_add::value, "PartsContainer doesn't provide add() method");
|
||||
|
||||
template <typename T> static std::false_type has_last_check(check_second);
|
||||
template <typename T>
|
||||
static decltype(declval<T>().last(),
|
||||
static decltype((void)declval<T>().last(),
|
||||
std::true_type()) has_last_check(check_first);
|
||||
typedef decltype(has_last_check<PartsContainer>(check_first())) has_last;
|
||||
static_assert(has_last::value,
|
||||
@@ -554,7 +555,8 @@ struct parts_container_concept_check : std::true_type {
|
||||
static std::false_type has_substitute_last_check(check_second);
|
||||
template <typename T>
|
||||
static decltype(
|
||||
declval<T>().substitute_last(declval<typename T::format_part_type>()),
|
||||
(void)declval<T>().substitute_last(
|
||||
declval<typename T::format_part_type>()),
|
||||
std::true_type()) has_substitute_last_check(check_first);
|
||||
typedef decltype(has_substitute_last_check<PartsContainer>(
|
||||
check_first())) has_substitute_last;
|
||||
@@ -563,7 +565,7 @@ struct parts_container_concept_check : std::true_type {
|
||||
|
||||
template <typename T> static std::false_type has_begin_check(check_second);
|
||||
template <typename T>
|
||||
static decltype(declval<T>().begin(),
|
||||
static decltype((void)declval<T>().begin(),
|
||||
std::true_type()) has_begin_check(check_first);
|
||||
typedef decltype(has_begin_check<PartsContainer>(check_first())) has_begin;
|
||||
static_assert(has_begin::value,
|
||||
@@ -571,7 +573,7 @@ struct parts_container_concept_check : std::true_type {
|
||||
|
||||
template <typename T> static std::false_type has_end_check(check_second);
|
||||
template <typename T>
|
||||
static decltype(declval<T>().end(),
|
||||
static decltype((void)declval<T>().end(),
|
||||
std::true_type()) has_end_check(check_first);
|
||||
typedef decltype(has_end_check<PartsContainer>(check_first())) has_end;
|
||||
static_assert(has_end::value, "PartsContainer doesn't provide end() method");
|
||||
|
||||
Reference in New Issue
Block a user