gpt4 book ai didi

c++ - std::variant 转换构造函数不处理 const volatile 限定符

转载 作者:行者123 更新时间:2023-12-02 17:44:29 25 4
gpt4 key购买 nike

代码如下:

               int i    = 1;
const int i_c = 2;
volatile int i_v = 3;
const volatile int i_cv = 4;

typedef std::variant<int, const int, volatile int, const volatile int> TVariant;

TVariant var (i );
TVariant var_c (i_c );
TVariant var_v (i_v );
TVariant var_cv(i_cv);

std::cerr << std::boolalpha;

std::cerr << std::holds_alternative< int>(var ) << std::endl;
std::cerr << std::holds_alternative<const int>(var_c ) << std::endl;
std::cerr << std::holds_alternative< volatile int>(var_v ) << std::endl;
std::cerr << std::holds_alternative<const volatile int>(var_cv) << std::endl;

std::cerr << var .index() << std::endl;
std::cerr << var_c .index() << std::endl;
std::cerr << var_v .index() << std::endl;
std::cerr << var_cv.index() << std::endl;

输出:

true
false
false
false
0
0
0
0

coliru

所以std::variant转换构造函数不考虑转换源类型的 const volatile 限定符。这是预期的行为吗?

有关从 cppreference.com 转换构造函数的信息

Constructs a variant holding the alternative type T_j that would be selected by overload resolution for the expression F(std::forward<T>(t)) if there was an overload of imaginary function F(T_i) for every T_i from Types...

问题在于,在上述情况下,此类虚函数的重载集是不明确的:

void F(               int) {}
void F(const int) {}
void F( volatile int) {}
void F(const volatile int) {}

coliru

cppreference.com 对此案只字不提。标准有规定吗?

我正在自己实现 std::variant类(class)。我的转换构造函数的实现是基于this idea 。结果与上面所示相同(选择第一个合适的替代方案,即使还有其他替代方案)。 libstdc++ 可能以相同的方式实现它,因为它也选择第一个合适的替代方案。但我仍然想知道这是否是正确的行为。

最佳答案

是的,这就是按值传递时函数的工作原理。

函数void foo(int)和函数void foo(const int)以及函数void foo(volatile int)和函数void foo(const volatile int) are all the same function .

通过扩展,您的变体的转换构造函数没有区别,也没有有意义的方式来使用其替代方案仅在顶级cv-qualifier方面有所不同的变体。

(好吧,你可以使用显式模板参数来emplace,正如 Marek 所示,但为什么?为了什么目的?)

[dcl.fct/5] [..] After producing the list of parameter types, any top-level cv-qualifiers modifying a parameter type are deleted when forming the function type. [..]

关于c++ - std::variant 转换构造函数不处理 const volatile 限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57925019/

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