关于重载决议和const语义
  • 板块学术版
  • 楼主zhizhizhiwang
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/11/26 13:44
  • 上次更新2024/11/26 17:43:00
查看原帖
关于重载决议和const语义
776232
zhizhizhiwang楼主2024/11/26 13:44

背景:

想实现类Python的print函数
win7电脑
使用小熊猫c++3.1.2871
内置编译器版本MinGW-W64 GCC11.4.0 64-bit
均为debug模式编译, 参数-std=c++14 -g

问题:

在有函数print(const char x)的情况下把char字面量匹配print(T const x){...}
以及在是否使用<>指定类型时的玄学问题

代码:

#include <iostream>

template <typename T>
void print(T const t)
{
	T x = t;
	if(x < 0) x = -x;
	if(x > 9)print(x / 10);
	putchar(x % 10 + '0');
}

void print(const char x)
{
	putchar(x);
}

template<typename T, typename... Args>
void print(T x, Args... args)
{
	print<T>(x);
	print(args...);
}

int main()
{
	print('a', 0, 'b', 5);
}

输出970985

代码(唯一区别在于未使用print(x))

#include <iostream>

template <typename T>
void print(T const t)
{
	T x = t;
	if(x < 0) x = -x;
	if(x > 9)print(x / 10);
	putchar(x % 10 + '0');
}

void print(const char x)
{
	putchar(x);
}

template<typename T, typename... Args>
void print(T x, Args... args)
{
	print(x);
	print(args...);
}

int main()
{
	print('a', 0, 'b', 5);
}

输出a0b5符合预期


而对于如下代码:

template <typename T>
void print(T const t)
{
	T x = t;
	if(x < 0) x = -x;
	if(x > 9)print(x / 10);
	putchar(x % 10 + '0');
}

void print( const char* x)
{
	for(size_t i = 0, end = strlen(x);i < end; i++)
	{
		putchar(x[i]);
	}
}

template<typename T, typename... Args>
void print(T x, Args... args)
{
	print(x);
	print(args...);
}

int main()
{
	int32_t n = 10;
	print(n, "s", 5);
}

输出10s5符合预期
而仅仅调换const与char*的位置

template <typename T>
void print(T const t)
{
	T x = t;
	if(x < 0) x = -x;
	if(x > 9)print(x / 10);
	putchar(x % 10 + '0');
}

void print(char* const x)
{
	for(size_t i = 0, end = strlen(x);i < end; i++)
	{
		putchar(x[i]);
	}
}

template<typename T, typename... Args>
void print(T x, Args... args)
{
	print(x);
	print(args...);
}

int main()
{
	int32_t n = 10;
	print(n, "s", 5);
}

则编译失败, 提示 [错误] ordered comparison of pointer with integer zero ('const char*' and 'int')
而将char* const x改为char const *x

template <typename T>
void print(T const t)
{
	T x = t;
	if(x < 0) x = -x;
	if(x > 9)print(x / 10);
	putchar(x % 10 + '0');
}

void print(char const *x)
{
	for(size_t i = 0, end = strlen(x);i < end; i++)
	{
		putchar(x[i]);
	}
}

template<typename T, typename... Args>
void print(T x, Args... args)
{
	print(x);
	print(args...);
}

int main()
{
	int32_t n = 10;
	print(n, "s", 5);
}

输出10s5符合预期

求助大佬, 实在看不太懂cpp的模版匹配,望指教。

2024/11/26 13:44
加载中...