如何强制函数参数为相同类型并且不允许使用类型构造函数匹配给定类型?

Posted

技术标签:

【中文标题】如何强制函数参数为相同类型并且不允许使用类型构造函数匹配给定类型?【英文标题】:How to force function parameter to be the same type and not allow using the type constructor to match the given type? 【发布时间】:2012-04-29 14:18:11 【问题描述】:

在 C++ 中发现这个功能让我有点惊讶,没想到会发生。

代码如下:

struct XY 
    int x,y;
    XY(int v) : x(v), y(v) 
;

bool test1(const XY &pos)
    return pos.x < pos.y;

bool test1(int x, int y)
    return x < y;

void functest()
    int val = 5;
    test1(val);

所以我可以调用一个带有整数参数的函数,无论是否存在这样的重载,它都会使用 XY 类型的函数,因为它有一个相同类型的构造函数!我不希望这种情况发生,我能做些什么来防止这种情况发生?

【问题讨论】:

【参考方案1】:

使XY 构造函数显式:

explicit XY(int v) : x(v), y(v) 

这将禁止从 intXY 的隐式转换,当您调用单参数 test1 函数时会发生这种情况。

【讨论】:

【参考方案2】:

我不明白为什么这对你不利。您的代码中实际上没有其他匹配项。你用一个参数调用了一个函数,你得到了最匹配的函数。

如果你有这个,那就不一样了:

bool test1(const XY &pos)
    return pos.x < pos.y;


bool test1(int x)
    return !x;


void functest()
    int val = 5;
    test1(val);

如果要运行第一个,那就不好了,因为 C++ 不“喜欢”使用隐式构造函数。它倾向于“首先输入类型,然后是构造函数中具有该类型的任何对象。”

但你所拥有的是 1 个论点与 2 个论点。我不知道为什么这是一个问题。

【讨论】:

我最初有 3 个函数:XY、int+int 和 int。对于 int,我将 x/y 值组合成一个整数以进行数组访问。现在我意识到这种方法在某些情况下非常危险,所以我决定摆脱它:更改代码的最简单方法是删除 int 函数,但令人惊讶的是我注意到它仍然编译得很好,导致我找不到修复的地方。但是,我仍然认为不应该像从另一个类型构造函数那样转换类型......对我来说似乎很奇怪。 -1:C++ 的开发者添加了explicit 有很好的理由。仅仅因为构造函数采用某些参数并不意味着您总是希望它允许转换。有时,你真的想要一个错误,你不希望编译器找到一种方法让它工作。因为“工作”是错误的。 好的,我明白了。这不是为人们提供-1的理由。只是在给出的示例中,当我回应它时,由于一个参数而不是两个参数,这是一个非因素,与需要 explicit 关键字无关。

以上是关于如何强制函数参数为相同类型并且不允许使用类型构造函数匹配给定类型?的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型方法和构造函数

Scala:如何在case类构造函数中使用类型作为第一类值?

为什么我不能在不同的数据类型中重用相同的值构造函数?

第九章

给定传递给它的参数类型,如何确定函数参数的类型?

拷贝构造函数的参数为什么必须使用引用类型(避免无限递归拷贝,但其实编译器已经强制要求了)