c++ - 如何在C++11中优雅地解决二义性声明?

标签 c++ c++11 standards variable-declaration function-declaration

struct A
{
    A(int) {}
    A(std::initializer_list<int>) {}
};

template<typename T>
struct B
{
    B(A) {}
    B(std::initializer_list<T>) {}
};

int main()
{
    int n{};
    B   m1(A{n}); // error: call A::A(std::initializer_list<int>)
    B   m2(A(n)); // error: just a function declaration: B m2(A n);
}

如上面代码所示,我要调用B::B(A(int))构造 B 类的对象。我有两个选择:

  1. B m1(A{n});
  2. B m2(A(n));

根据C++ Core Guidelines ,首选前者。

但是,B m1(A{n});会打电话A::A(std::initializer_list<int>)而不是A::A(int) ,这不是有意的。所以,我必须使用B m2(A(n)); ,但它只是一个函数声明: B m2(A n); !

如何在 C++11 中优雅地解决不明确的声明?

最佳答案

almost always auto习语来救援。

我不确定您想要 T 是什么,因为代码示例中不清楚。我使用了 double 因为...为什么不呢。

int main() {
    auto n = int{};
    auto m1 = B<double>(A{n});
    auto m2 = B<double>(A(n));
}

免责声明:我在现实生活中(在我的工作中)交谈过的 C++ 开发人员中,约有一半绝对鄙视几乎总是自动。我喜欢它(但我已经用 var、F# 和 TypeScript 完成了很多 C# 工作,一切照旧;还有 C++ 模板代码和 lambda-with-auto),但是有 <许多人强烈反对汽车。如果您决定在自己的项目中几乎总是使用自动,我强烈建议您在走这条路之前与同事讨论并获得团队共识。

关于c++ - 如何在C++11中优雅地解决二义性声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61157380/

相关文章:

C++11 搜索对象 vector

c++ - 在可变数量的标记碱基上进行模板化

c++ - 如何检查类型是否是 C++ 中模板类的类型参数?

c++ - std::bind 不会接受绑定(bind)占位符的 std::cref - 为什么?

c++ - 在 C++ 程序中从 C 库调用函数时有什么陷阱吗?

c++没有匹配函数来调用 vector push_back

c++ - 类中的嵌套类或结构

c++ - 我如何向图书馆工作组提出一项功能?

c - 编译器是否允许消除无限循环?

git:在不改变所有权/blame 的情况下改变样式(空白)?