首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NULL和0的行为相同的问题

NULL和0的行为相同的问题
EN

Stack Overflow用户
提问于 2021-05-27 13:53:28
回答 2查看 97关注 0票数 2

我当时正在上一门课:

代码语言:javascript
运行
复制
#include <iostream>
#include <list>
using namespace std;

class Int{
    list <int64_t> data;
    bool sign;
public:
    Int(int64_t val = 0) : sign(false) {
        cout << "Int(int) called\n";
    }
    Int(const char* str): sign(false) {
        cout << "Int(const char* called)\n";
    }
};

int main(){
    Int a = "328739";     // line 1, ok
    Int a2 = "ehfjhs";    // line 2, ok
    Int a3 = 4338974;     // line 3, ok
    Int a4 = 0;    //line 4, Issue
    return 0;
}

除了第4行之外,一切都很正常。

只要我执行Int a4 = 0;,构造函数Int(const char* str)就会被调用,因为0等同于NULL。但我希望调用的是Int(int64_t val = 0)

我可以做的一个简单的修复方法是做Int a4 = int(0);,这在某一方面是可以的。但我想让它更灵活,所以0只触发Int(int64_t val = 0)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-27 15:16:59

作为另一个答案的替代方案,您可以创建一个接受任何整型的模板构造函数。这将解决多义性,并额外适用于任何整型或文字。

代码语言:javascript
运行
复制
#include <iostream>
#include <list>
using namespace std;

class Int{
    list <int64_t> data;
    bool sign;
public:
    template <typename T, std::enable_if_t<std::is_integral_v<T>>* = nullptr>
    Int(T val = 0) : sign(false) {
        cout << "Int(Integral) called\n";
    }
    Int(const char* str): sign(false) {
        cout << "Int(const char* called)\n";
    }
};

int main(){
    Int a = "328739";     // line 1, ok
    Int a2 = "ehfjhs";    // line 2, ok
    Int a3 = 4338974;     // line 3, ok
    Int a4 = 0;           // line 4, ok
    return 0;
}
票数 4
EN

Stack Overflow用户

发布于 2021-05-27 14:12:44

这里的关键点是,0不是int64_t,所以在用于任何一个构造函数之前,它必须经过隐式转换。这两个构造函数在这里同样有效。实际上,gcc和clang将歧义标记为错误,而不是像您正在经历的那样任意选择一个。

0的类型是int,所以如果您有一个int构造函数,它将绑定到0,而不需要事先进行任何隐式转换,这解决了歧义:

代码语言:javascript
运行
复制
class Int{
    list <int64_t> data;
    bool sign;
public:
    Int(int64_t val = 0) : sign(false) {
        cout << "Int(int) called\n";
    }
    Int(int val) : sign(false) {
        cout << "Int(int) called\n";
    }
    Int(const char* str): sign(false) {
        cout << "Int(const char* called)\n";
    }
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67716395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档