如何在 C++11 中优雅地解决歧义声明?
How to solve ambiguous declarations elegantly in C++11?
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))
构造一个classB
的对象。我有两个选择:
B m1(A{n});
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中声明不明确的问题?
您可以为参数添加另一个括号 A(n)
。
B m2((A(n)));
怎么样...
auto m1 = B(A(n));
almost always auto 成语来拯救。
我不确定你想要 T 是什么,因为它在代码示例中不清楚。我使用 double
因为...为什么不呢。
int main() {
auto n = int{};
auto m1 = B<double>(A{n});
auto m2 = B<double>(A(n));
}
免责声明:我在现实生活中(在我的工作中)交谈过的 C++ 开发人员中大约有一半绝对鄙视 几乎总是 auto。我喜欢它(但我已经使用 var
、F# 和 TypeScript 完成了很多 C#,这一切照常;以及 C++ 模板代码和 lambda-with-auto),但有 很多 强烈反对汽车。如果您决定在自己的项目中几乎总是使用 auto,我强烈建议您在走这条路之前与您的同事讨论并获得团队共识。
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))
构造一个classB
的对象。我有两个选择:
B m1(A{n});
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中声明不明确的问题?
您可以为参数添加另一个括号 A(n)
。
B m2((A(n)));
怎么样...
auto m1 = B(A(n));
almost always auto 成语来拯救。
我不确定你想要 T 是什么,因为它在代码示例中不清楚。我使用 double
因为...为什么不呢。
int main() {
auto n = int{};
auto m1 = B<double>(A{n});
auto m2 = B<double>(A(n));
}
免责声明:我在现实生活中(在我的工作中)交谈过的 C++ 开发人员中大约有一半绝对鄙视 几乎总是 auto。我喜欢它(但我已经使用 var
、F# 和 TypeScript 完成了很多 C#,这一切照常;以及 C++ 模板代码和 lambda-with-auto),但有 很多 强烈反对汽车。如果您决定在自己的项目中几乎总是使用 auto,我强烈建议您在走这条路之前与您的同事讨论并获得团队共识。