小编Sla*_*vov的帖子

C++转换运算符到chrono :: duration - 适用于c ++ 17但不适用于C++ 14或更低版本

下面的代码使用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)

c++ conversion-operator c++-chrono c++14 c++17

8
推荐指数
2
解决办法
488
查看次数

使用 gcc 和 clang 构建 C++ std::vector 时的不同行为

在下面的示例中,我期望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 版本中尝试了此代码,其行为相同。这里有一些直接尝试的链接:gccclang

#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)

c++ gcc clang

8
推荐指数
1
解决办法
600
查看次数

标签 统计

c++ ×2

c++-chrono ×1

c++14 ×1

c++17 ×1

clang ×1

conversion-operator ×1

gcc ×1