gpt4 book ai didi

c++ - 为什么 make_optional 会衰减它的参数类型?

转载 作者:IT老高 更新时间:2023-10-28 22:17:07 26 4
gpt4 key购买 nike

(可能不是 C++14,可能是 Library TS)工具 make_optional被定义(in n3672)为:

template <class T>
constexpr optional<typename decay<T>::type> make_optional(T&& v) {
return optional<typename decay<T>::type>(std::forward<T>(v));
}

为什么要转换类型T (即不只是返回 optional<T> ),并且是否有使用 decay 的哲学(以及实际)理由具体作为转型?

最佳答案

decay 的一般用途就是取一个类型,修改为适合存储。

看看这些 decay 的例子工作,而 remove_reference不会:

auto foo( std::string const& s ) {
if (global_condition)
return make_optional( s );
else
return {};
}

void function() { std::cout << "hello world!\n"; }
auto bar() { return std::make_optional( function ); }

int buff[15];
auto baz() { return std::make_optional( buff ); }

optional<int[15]>将是一个非常奇怪的野兽——C 风格的数组在被视为文字时表现不佳,这就是 optional对它的参数做T .

如果您要复制数据,constvolatile来源的性质无关紧要。并且您只能通过将数组和函数衰减为指针来制作简单的数组和函数拷贝(而不会退回到 std::array 或类似内容)。 (理论上,可以做一些工作来使 optional<int[15]> 工作,但这会带来很多额外的复杂性)

所以 std::decay解决所有这些问题,并且不会真正引起问题,只要您允许 make_optional推断其参数的类型而不是传递 T字面意思。

如果你想传入 T从字面上看,没有理由使用 make_optional毕竟。

关于c++ - 为什么 make_optional 会衰减它的参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24557000/

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