gpt4 book ai didi

c++ - Ret (&)(Args...) 和 Ret (Args...) & 有什么区别?

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:59 27 4
gpt4 key购买 nike

当我尝试像这样编写自己的decay_t时:

#include <utility>
template <class T>
struct auto_decay {
auto operator () () noexcept {
return std::declval<T>();
}
};

template <class T> using decay_t = decltype( (decl_as<decay_impl::auto_decay< T >>())() );

并使用以下方法对其进行测试:

#include <type_traits>
int main() {
static_assert(is_same<decay_t<int ()&>, int (*)()>{}());
}

我遇到了以下错误:

In file included from test_decay.cc:1:
In file included from ./../src/decay.hpp:4:
In file included from ./../src/utility.hpp:3:
./../src/add_reference.hpp:17:14: error: reference to function type 'int () &' cannot have '&' qualifier
typedef T&& type;
^
./../src/add_reference.hpp:20:1: note: in instantiation of template class 'nxwheels::concept_check::add_rvalue_reference<int () &>' requested here
using add_rvalue_reference_t = typename add_rvalue_reference<T>::type;
^
./../src/utility.hpp:14:1: note: in instantiation of template type alias 'add_rvalue_reference_t' requested here
auto declval() noexcept -> add_rvalue_reference_t<T>;
^
./../src/decay.hpp:10:16: note: while substituting explicitly-specified template arguments into function template 'declval'
return declval<T>();
^
./../src/decay.hpp:16:46: note: in instantiation of member function 'nxwheels::concept_check::decay_impl::auto_decay<int () &>::operator()' requested here
template <class T> using decay_t = decltype( (decl_as<decay_impl::auto_decay< T >>())() );
^
test_decay.cc:17:17: note: in instantiation of template type alias 'decay_t' requested here
assert_same<decay_t<int (void)&>, int (*)(void)>();
^
In file included from test_decay.cc:1:
./../src/decay.hpp:10:16: error: call to function 'declval' that is neither visible in the template definition nor found by argument-dependent lookup
return declval<T>();
^
./../src/decay.hpp:16:46: note: in instantiation of member function 'nxwheels::concept_check::decay_impl::auto_decay<int () &>::operator()' requested here
template <class T> using decay_t = decltype( (decl_as<decay_impl::auto_decay< T >>())() );
^
test_decay.cc:17:17: note: in instantiation of template type alias 'decay_t' requested here
assert_same<decay_t<int (void)&>, int (*)(void)>();
^
./../src/utility.hpp:14:6: note: 'declval' should be declared prior to the call site
auto declval() noexcept -> add_rvalue_reference_t<T>;
^
In file included from test_decay.cc:2:
./../src/concepts/is_same.hpp:18:5: error: static_assert failed
static_assert(is_same_v<T1, T2>);
^ ~~~~~~~~~~~~~~~~~
test_decay.cc:17:5: note: in instantiation of function template specialization 'nxwheels::concept_check::assert_same<int, int (*)()>' requested here
assert_same<decay_t<int (void)&>, int (*)(void)>();
^
3 errors generated.

但是当我把测试改成:

#include <type_traits>
int main() {
static_assert(is_same<decay_t<int (&)()>, int (*)()>{}());
}

然后测试就过去了,一直看不懂int(&)()int()&有什么区别。我检查了 std::is_funcionDeclaring functions ,两者都表示 int () &,而不是 int (&)()

编辑:

顺便说一句,在 std::is_funcion可能的实现部分, Ret (Args...) & 是 std::is_function 的特化。他们会怎么做?

最佳答案

R(&)(Arg...) 是对函数的引用, 而 R(Arg...)& 是声明的成员函数的符号

struct test {
void func() &;
};

编辑:

#include <type_traits>

struct test {
void func1() &;
};

template<typename>
struct PM_traits {};

template<class T, class U>
struct PM_traits<U T::*> {
using member_type = U;
};

int main()
{
using P = PM_traits<decltype(&test::func1)>::member_type;
static_assert(std::is_function<P>::value);
}

这要归功于支持 R(Arg...)&std::is_function 的重载

关于c++ - Ret (&)(Args...) 和 Ret (Args...) & 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50990511/

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