禁止赋给左值,及全局operator= 如何实现

GKatHere 2017-02-16 07:04:07
如题:禁止赋给左值,及全局operator= 如何实现
以例说话:


struct A
{
char a[10];
A(){a[0] ='a'; a[1] =0;};
~A(){a[0] =0;};
operator const char*()
{
return a;
}
};
A get()
{
return A();
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
char ss[100];
sprintf(ss, "%s", (LPCSTR)get()); // OK
LPCSTR s =get(); // 必须不OK
sprintf(ss, "%s", s);
}
// 如何让LPCSTR s =get(); 编译错误
// 及 全局operator=(LPCSTR, const A&)如何实现
...全文
176 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
几罗星人 2017-02-19
  • 打赏
  • 举报
回复
先回答一个问题,全局operator= 如何实现?答案是不可能,语言规范禁止的语法,神仙都没救
几罗星人 2017-02-19
  • 打赏
  • 举报
回复
对于禁止赋给左值,一点都不出奇。请在LPCSTR上右键,单击定义。LPCSTR定义在winnt.h中(估计其他地方也有,看你的引入了什么头文件),定义如下:
typedef _Null_terminated_ CONST CHAR *LPCSTR, *PCSTR;

注意到CONST了吗?再找CONST的定义是const。也就是说LPCSTR s意味着s是一个常量,尽管operator const char*()返回的是常量,但这也是运行期的事,s必须在编译器产生初值,也就是说如果不在编译器将这个函数运行一次是不可能给s初始化的。

按道理是这样,但是VS2015居然编译通过了


正常思路的话是用C++11的关键字constexpr,但是这个关键字到VS2015都不支持,好像微软说永远都不会支持它
fesdobat 2017-02-17
  • 打赏
  • 举报
回复
这里的问题是,临时对象暴露内部指针到底合不合法。 因为存在 sprintf(ss, "%s", (LPCSTR)get()); 的调用方式, 所以c++是承认它合法的; 但是面对 LPCSTR s =get(); 这样的情况, 似乎只能靠程序员的纪律性来保证了。 就连std的string对你的问题也束手无策:
using A = std::string;

A get()
{
	return A();
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	using LPCSTR = const char*;
	char ss[100];
	sprintf(ss, "%s", get().c_str());    //    OK
	LPCSTR s = get().c_str();                    //    必须不OK
	sprintf(ss, "%s", s);
}
以及最后, c++没有全局operator=函数。
paschen 版主 2017-02-16
  • 打赏
  • 举报
回复
operator const char*() 改成; explicit operator const char*() http://en.cppreference.com/w/cpp/language/explicit
幻夢之葉 2017-02-16
  • 打赏
  • 举报
回复
又想让马跑又不给马吃草,何必呢!
yshuise 2017-02-16
  • 打赏
  • 举报
回复
struct A { char a[10]; A(){a[0] ='a'; a[1] =0;}; ~A(){a[0] =0;}; operator const char*() { return a; } private: void get() { } };

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧