gpt4 book ai didi

c++ - 转换为 std::optional 时 Clang 和 GCC 中的不同结果

转载 作者:IT老高 更新时间:2023-10-28 21:52:45 26 4
gpt4 key购买 nike

给定以下代码:

#include <iostream>
#include <optional>

struct foo
{
explicit operator std::optional<int>() {
return std::optional<int>( 1 );
}
explicit operator int() {
return 0;
}
};

int main()
{
foo my_foo;
std::optional<int> my_opt( my_foo );
std::cout << "value: " << my_opt.value() << std::endl;
}

gcc 7.2.0 writes 值:1.

MSVC 2017 (15.3) 和 clang 4.0.0 however write 值:0.

根据 C++ 标准,哪一个是正确的?

最佳答案

由于这是直接初始化,我们enumerate the constructors并选择最好的。 std::optional 的相关构造函数是:

constexpr optional( const optional& other ); // (2)
constexpr optional( optional&& other ) noexcept(/* see below */); // (3)

template < class U = value_type >
/* EXPLICIT */ constexpr optional( U&& value ); // (8), with U = foo&

两者都是可行的((8) 仅在 int 可从 foo& 构造且 foo 既不是 std::in_place_t 也不是 std::optional<int> 时才参与重载解决方案,所有这些都成立),但 (8)是完全匹配,而 (2)(3)需要用户定义的转换,所以它应该是首选。 gcc 在这里是错误的。

然而,gcc 实际上并没有调用 (3)任何一个。它只是直接初始化my_opt从转换结果my_foooptional<int> .这个带有 gcc 7.2 的程序打印 3但没有一个1a , 1b , 或 2 :

#include <iostream>

template <class T>
struct opt {
opt() { }
opt(opt const& ) { std::cout << "1a\n"; }
opt(opt&& ) { std::cout << "1b\n"; }

template <class U>
opt(U&& ) { std::cout << "2\n"; }
};

struct foo
{
explicit operator opt<int>() { std::cout << "3\n"; return {}; }
};

int main()
{
opt<int> o(foo{});
}

我不认为这是一条允许的路线。我提交了81952 .

关于c++ - 转换为 std::optional<T> 时 Clang 和 GCC 中的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45843428/

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