gpt4 book ai didi

c++ - std::declval()、SFINAE 和删除的构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:57 25 4
gpt4 key购买 nike

在 C++11 中使用 SFINAE 进行方法检测,我编写了这个小运行示例:

#include <type_traits>

struct Foo
{
Foo();// = delete;
Foo(int);

void my_method();
};

template <typename T, typename ENABLE = void>
struct Detect_My_Method
: std::false_type
{
};

template <typename T>
struct Detect_My_Method<T, decltype(T().my_method())>
: std::true_type
{
};

int main()
{
static_assert(!Detect_My_Method<double>::value, "");
static_assert(Detect_My_Method<Foo>::value, "");
}

按预期工作。

但是,如果我删除 Foo 的空构造函数:

struct Foo
{
Foo() = delete;
Foo(int);

void my_method();
};

该示例不再不工作,我收到此错误消息:

g++ -std=c++11 declVal.cpp 
declVal.cpp: In function ‘int main()’:
declVal.cpp:33:3: error: static assertion failed
static_assert(Detect_My_Method<Foo>::value, "");

问题:解释及如何解决?

最佳答案

当空构造函数被删除时构造:

decltype(Foo().my_method());

不再是无效并且编译器立即提示

error: use of deleted function ‘Foo::Foo()’

一种解决方案是使用 std::decval<T>()

Converts any type T to a reference type, making it possible to use member functions in decltype expressions without the need to go through constructors.

因此替换:

template <typename T>
struct Detect_My_Method<T, decltype(T().my_method())>
: std::true_type
{
};

通过

template <typename T>
struct Detect_My_Method<T, decltype(std::declval<T>().my_method())>
: std::true_type
{
};

解决问题。

经验教训:

decltype(Foo().my_method());                // invalid
decltype(std::declval<Foo>().my_method()); // fine

不等价。

关于c++ - std::declval<T>()、SFINAE 和删除的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47134721/

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