下面的代码使用gcc 7.1.0编译,C++ 17设置,但不使用C++ 14 set(或Visual Studio 2017)编译.它很容易在Wandbox上重现.
要使它与C++ 11/14一起使用需要做些什么?
#include <iostream>
#include <chrono>
int main()
{
struct Convert
{
operator std::chrono::milliseconds()
{
std::cout << "operator std::chrono::milliseconds" << std::endl;
return std::chrono::milliseconds(10);
}
operator int64_t ()
{
std::cout << "operator int64_t" << std::endl;
return 5;
}
};
Convert convert;
std::chrono::milliseconds m(convert);
std::cout << m.count() << std::endl;
int64_t i(convert);
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud) 在下面的示例中,我期望v有 1 个元素,其var类型为Vector并将包含两个“int” Variant10 和 20。这是我可以通过 gcc 看到的行为。
对于 clang,“v”包含两个元素,即两个“int” Variant10 和 20。
我认为gcc的向量是通过initializer_list构造函数创建的,而clang的向量是通过move构造函数创建的
这是其中一个编译器的错误吗?我是否需要创建Variant的构造函数explicit(这将迫使我像 一样使用它Variant::Vector v{Variant{Variant::Vector{10, 20}}};。如果我想让构造函数保持非显式,是否有其他方法可以避免此问题?
在https://wandbox.org/中的所有 gcc 和 clang 版本中尝试了此代码,其行为相同。这里有一些直接尝试的链接:gcc、clang
#include <iostream>
#include <variant>
#include <vector>
struct Variant
{
using Vector = std::vector<Variant>;
Variant(const Vector & value)
{
var = value;
}
Variant(Vector && value)
{
var = std::move(value);
}
Variant(int value)
{
var = value;
}
std::variant<Vector, int> …Run Code Online (Sandbox Code Playgroud)