gpt4 book ai didi

c++ - bool 和它的 not 值怎么可能都是 false 呢?

转载 作者:行者123 更新时间:2023-11-27 22:48:47 25 4
gpt4 key购买 nike

在尝试解决 this (un)problem 时,我注意到一个非常奇怪的行为,简而言之,这使得 bool 成为可能。是错误的,它的 ! (不是值(value))也是错误的。我想知道这怎么可能。导致这种情况的代码如下:

template<typename T, typename TID = unsigned int>
struct AId {
typedef AId<T, TID> type;
typedef T handled_type;
typedef TID value_type;

private:
value_type id;

template<typename _T> struct IsIncrementable
{
template<typename _U> using rm_ref = typename std::remove_reference<_U>::type;
typedef char (&yes)[1];
typedef char (&no)[2];
template<class _U>
static yes test(_U *data, typename std::enable_if<
std::is_same<_U, rm_ref<decltype(++(*data))>>::value
>::type * = 0);
static no test(...);
static const bool value = sizeof(yes) == sizeof(test((rm_ref<_T> *)0));
};

public:
explicit AId(const value_type &id) : id(id) {}

...

//IsIncrementable<value_type>::value is false:
//error: no type named 'type' in 'struct std::enable_if<false, int>'
template<typename std::enable_if<IsIncrementable<value_type>::value, int>::type = 0>
type operator++(int /*postfix*/) { type old(id); ++id; return old; }

//!IsIncrementable<value_type>::value is also false:
//error: no type named 'type' in 'struct std::enable_if<false, int>'
template<typename std::enable_if<!IsIncrementable<value_type>::value, int>::type = 0>
type operator++(int /*postfix*/) { type old(id); ++id; return old; }
};

IsIncrementable<value_type>::value怎么可能是假的,!IsIncrementable<value_type>::value也是假的?

最佳答案

SFINAE 仅适用于模板实例化的直接上下文。这是一个较短的示例:

template <class T>
struct X {
template <std::enable_if_t<std::is_pointer<T>::value, int> = 0>
void foo() {
}
};

T到时候已经知道foo已实例化,因此在替换该函数模板期间不会发生故障。这是一个严重的错误。你甚至不能实例化 X<int>因为enable_if_t<false, int>已经是病态的,不管你是否调用foo .

你必须引入一个默认的类型参数,它实际上会落入直接上下文:

template <class T>
struct X {
template <class U=T, std::enable_if_t<std::is_pointer<U>::value, int> = 0>
void foo() {
}
};

现在,SFINAE-ing on U很好 - U是此函数的本地模板参数,因此实例化将延迟到使用此函数。所以X<int>{}很好,X<int>{}.foo()将失败,因为重载解析无法找到可行的重载 - 这 foo()刚刚被删除。

关于c++ - bool 和它的 not 值怎么可能都是 false 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40001901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com