std::按类型的变体构造

问题描述 投票:0回答:1

我试图通过给它一个可以构造其

std::variant<Ts...>
之一的值来理解
Ts
的构造。 参考资料

std::变体::变体

...

(4)

template<class T> constexpr variant(T&& t) noexcept(/* see below */);

...

(4) 转换构造函数。构造一个包含 替代类型

T_j
将由重载决策选择 如果存在过载,则表达式
F(std::forward<T>(t))
F(T_i)
中每个
T_i
的虚函数
Types...
,除了 不考虑缩小转换。

正式: 仅当声明

F(T_i)
对于某些发明变量
T_i x[] = { std::forward<T>(t) };
有效时才考虑重载
x

从这个片段中,我预计以下内容会起作用:

using Var = std::variant<uint32_t, uint64_t>; // alias OK
([](uint32_t){})(std::forward<uint8_t>(12)); // compiles fine --> imaginary function F can be called
uint32_t x[] = {std::forward<uint8_t>(12)}; // compiles fine --> array declaration is valid

static_assert(std::is_constructible_v<Var, uint8_t>); // assertion fails

但事实并非如此(断言失败)。是因为

uint32_t
uint64_t
之间的歧义都可以用
uint8_t
构造吗?我在 cppreference 链接中没有找到任何相关信息(也许我是瞎子)。

c++ constructor variant
1个回答
0
投票

哦,现在我盯着我链接的段落,答案显然是“是”,这是因为含糊不清。该参考文献指出,如果所有

 
F(uint32_t) 都存在过载 ,则应选择
Ts
。确实,如果有
F(uint32_t)
F(uint64_t)
,那么前者就不会被选中!

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.