假设我有一个c ++类
class xyz
{
...
};
class abc
{
shared_ptr<xyz> ptr;
..
abc():ptr( new xyz()) // line 1
{
}
};
第1行调用了什么?
make_shared<xyz>()
或
shared_ptr<xyz>(new xyz())
是否依赖于编译器?
答案 0 :(得分:2)
该语言几乎没有自动使用图书馆设施。
在某些情况下,核心语言依赖于标准库,是的。例如。您必须包含<typeinfo>
标头才能使用typeid
运算符。并且std::terminate
调用了未处理的异常。但除了这些非常特殊和基本的案例外,核心语言和标准库是分开的。有了必要的编译器和操作系统特定功能的知识,您可以自己实现标准库。
因此,简而言之,通过调用new
,您的make_shared
- 表达式无法保证神奇替换,但如果编译器可以保证可见效果相同,可在 as-if 规则下优化。
据我所知,自2016年8月起,尚未编制任何编译器。