c++11:error:locale::facet::_S_create_c_locale name not valid

最近在做一个linux-arm平台的项目时,遇到如如下错误

error:locale::facet::_S_create_c_locale name not valid

按照网上的找到所有答案都是要为主机添加语言支持,可是对于我们来说,程序是在客户的设备上跑的,要求用户添加特定的设置并不现实。

通过反复查找,定位到下面的代码,是一个将字符串转大写的模板函数:

template<typename E,
		typename TR = std::char_traits<E>,
		typename AL = std::allocator<E>>
	inline std::basic_string<E, TR, AL> toupper(const std::basic_string<E, TR, AL>&src) {
		auto dst = src;
		static const std::locale loc("");
		transform(src.begin(), src.end(), dst.begin(), [&](E c)->E {return std::toupper(c, loc); });
		return dst;
	}

这个代码我在windows-x86-64,linux-x86-64,android-arm平台能正常运行,唯独在linux-arm上跑出上面的问题。
如这个代码std::locale loc("")
std::locale对象是传了一个空字符串来构造的.既然提示name not valid(名字无效),应该就是指输入的空字符串做参数不对喽。

又查了一下std::locale是有默认构造函数的。于是将上面的代码改为

static const std::locale loc;

问题解决,修改后的代码其他平台(windows-x86-64,linux-x86-64,android-arm)也没有问题.

我已经忘记当初为啥要填个空字符串做参数了.

上一篇:服务器配置 centos8配置中文显示


下一篇:CentOS:locale