gpt4 book ai didi

c++11 - 以下 C++11 代码应该如何工作?

转载 作者:行者123 更新时间:2023-12-04 15:09:06 24 4
gpt4 key购买 nike

以下代码在各种编译器上输出不同的结果:

  • Visual Studio 2013 上的 2,1,2
  • Visual Studio 2015 上的 2,2,2
  • GCC5/c++14 上的 2,1,1
  • 2,2,2 在 Clang 3.7 上使用 Microsoft Codegen
  • Ubuntu 14.04 下的 Clang 3.6/c++11 上的 2,1,2

  • 最后,它应该如何根据 C++ 标准工作?
    #include <iostream>
    #include <vector>
    #include <stdio.h>

    using namespace std;

    class Value;
    using Array = std::vector<Value>;

    class Value
    {
    public:
    Value(const Array &)
    {
    }

    Value(int)
    {
    }
    };

    void foo(Array const& a)
    {
    printf("%d\n", (int)a.size());
    }

    int main()
    {
    Array a1 = { 1, 2 };
    foo(a1);
    foo(Array{ a1 });
    foo(Array({ a1 }));
    }

    附言这篇文章中的 json_spirit 库也显示了同样的问题: http://www.codeproject.com/Articles/20027/JSON-Spirit-A-C-JSON-Parser-Generator-Implemented

    最佳答案

    您的程序在 C++11 中格式错误,因为您创建了一个 std::vector以不完整类型作为参数的类型。 vector 的值类型创建 std::vector<T> 时必须完整类型。

    作为一个格式错误的程序(我不知道诊断的要求),任何和所有行为在标准下都是合法的。
    vector的要求的 T是一个完整的类型可能是过度指定的(确实没有令人信服的理由来满足这个要求),但它存在。在 C++1z 中问同样的问题会得到不同的答案,因为这个要求已经放宽了。

    忽略这个问题,哲学上:

    Array a1 = { 1, 2 };

    这应该会生成一个 std::vector有两个元素。
    foo(a1);

    这应该通过 a1foo ,因为类型完全匹配。
    foo(Array{ a1 });

    我们有 {} .我的经验法则 {}是“如果它是非空的,并且它可以匹配 initializer_list 构造函数,它必须”。

    a1可以转换为 Value , Array{ a1 }是一个数组 Value .
    foo(Array({ a1 }));

    这里我们看一个构造函数的参数 Array可以用 { a1 } 调用.两者 std::initalizer_list<Value>Array&&构造函数可以。

    哪个叫应该无所谓: Array&&构造函数依次发送 {a1}std::initalizer_list<Value>构造函数。

    所以我的意见是它应该打印 211 .然而,这只是对应该做什么的意见,而不是对标准所说的应该做什么的分析,因为 C++11 标准非常清楚地表明您的程序格式不正确。

    另一方面,隐藏复制构造函数似乎很粗鲁。

    最后,你确实写了一个简单的疯狂类型。疯狂的行为是可以预料的。

    更实际的问题可能是 Value类型有 template恰好也匹配 std::vector<Value> 的构造函数.

    关于c++11 - 以下 C++11 代码应该如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37573132/

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