【问题标题】:Portability of auto keywordauto关键字的可移植性
【发布时间】:2015-09-17 17:00:53
【问题描述】:

我对使用 auto 关键字有点陌生。我工作的项目最近才切换到使用所有支持它的编译器。我想进行代码更改,我可以轻松地仅在需要正确的众多编译器之一上进行测试(我正在测试一个 ICC 版本。它需要在 ICC、GCC 和MSVC)。所以我想确保我对这种使用 auto 的理解是正确的。

原来的代码是: f_y( f_x() ); 其中 f_x() 将 const& 返回到某事物,而 f_y 将 const& 传递到同一事物。当且仅当它确实需要被复制和修改时,我才需要更改代码以复制/修改它。当不需要复制时,它可能太大而无法复制。于是我写了:

auto const& c=f_x();
if ( c.size()==1 && c[0].second<0.0 )
{
   auto c_copy = c;
   c_copy[0].second = 1.0;
   f_y( c_copy );
}
else
   f_y( c );

我很好奇在我第一次使用auto 时是否真的需要const,或者编译器是否推断出这是因为f_x() 返回const&amp;。但即使不需要,只要没有编译器被它弄糊涂,我希望它在那里使我的代码易于理解。

我主要是在问第二辆汽车。我测试过的一个编译器会调用被引用对象类型的复制构造函数(而不是只复制引用)。我很确定这是该代码唯一可能的含义。但我想要一点信心,所有理解 auto 的 ICC、GCC 和 MSVC 版本都会以这种方式理解它。

顺便说一句,c[0].first 的数据类型对编译器来说是已知的,但在源代码中此时程序员并不知道(也不相关)。

【问题讨论】:

  • 在某些情况下,当前编译器对 auto 执行不同的操作,例如:Different compiler behavior for expression: auto p {make_pointer()};const auto std::initializer_list difference between Clang and GCC,但我觉得大多数情况都是标准正在演变或出现错误的边缘情况。在大多数情况下,每个编译器的 auto 行为都应该相同。
  • 您不必在第一个上使用const。按照标准,第二个应该制作副本。但是,如果您必须迎合过时的编译器及其错误,那么您需要在所有您想要支持的编译器上对其进行测试。
  • @Yakk 不是具体的代码,但我认为这个问题是关于汽车可移植性的更普遍的问题。
  • @Shafik 我只是在询问我的问题中的具体用法。但我也将继续在该项目的其他地方扩展我对auto 的使用,所以我很感激这个警告。我将始终能够在比我需要支持的更少的编译器上进行测试。因此,我需要了解有效的方法和标准承诺的方法之间的任何重要区别。
  • 啊,可悲的是,如果您使用的所有编译器都声称它们支持 C++11,那么它们应该为您的情况一致地实现 auto。但是,在许多编译器中经常会发现错误,因此您仍然无法避免必须测试您所做的每个更改。

标签: c++


【解决方案1】:

auto 删除引用和顶级 cv 限定符(constvolatile)。

c 的类型是something const&amp;,即使你写了auto&amp; c = f_x()(与 Scott Meyers 的"Type Deduction and Why You Care" 幻灯片 15 上的v5 相同的情况),它也是一样的,所以你不需要那里需要const

c_copy 的类型是something(注意:没有const,即使RHS 是一个常量引用;与同一张幻灯片上的v3 相同),这就是c_copy = c 调用复制构造函数的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多