gpt4 book ai didi

c++ - std::declval() 是一个有效的表达式吗?

转载 作者:IT老高 更新时间:2023-10-28 22:39:43 36 4
gpt4 key购买 nike

据我所知,我无法声明对 void 的右值引用.
例如,以下代码格式错误:

 void f(void &&v) { }

来自 [20.2.6/1] (函数模板 declval)我们有一个 declval 的声明那就是:

template <class T>
add_rvalue_reference_t<T>
declval() noexcept;

因此,declval<void> (让我说)会导致 void && ,我猜它和前面的例子一样格式不正确。

无论如何,以下最小的工作示例可以编译:

#include<utility>

int main() {
decltype(std::declval<void>())* ptr = nullptr;
}

请注意,以下也是正确的:

static_assert(std::is_same<decltype(std::declval<void>()), void>::value, "!");

我原以为会是 void&&如前所述(或者更好的是,我期待它无法编译)。
实际上,它恰好是任何其他非引用类型的右值引用。
举个例子:

static_assert(std::is_same<decltype(std::declval<int>()), int&&>::value, "!");

declval<void>一个有效的表达与否?上面的代码合法吗?
为什么 void 的情况下的行为与任何其他类型不同? (否则它不会起作用如果代码是合法的,这可能是一个答案)。

如果它是合法的,那么标准在哪里允许这样做?我一直没能找到这个案子。
当然,标准说:

The template parameter T of declval may be an incomplete type.

无论如何,这将导致一个 Not Acceptable 类型 (void&&),它会绕过它丢弃右值引用。

最佳答案

add_rvalue_reference<T>只导致 T&&如果 T是可引用的类型。所以当Tvoid , 结果就是 void .这也是为什么你可以add_rvalue_reference<int&&>并且在尝试构造对引用的引用时不会出错。 (与左值引用相同。)

关于c++ - std::declval<void>() 是一个有效的表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39280993/

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