问题标签 [explicit-constructor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
422 浏览

c++ - 显式指定方法/构造函数是否意味着不能隐式调用它?

显式指定方法/构造函数是否意味着不能隐式调用它?我的意思是如果一个构造函数被指定为显式的,它不能被一些像 = 这样的操作符或像转换器构造函数这样的其他方法隐式调用吗?

在那种情况下,将方法/构造函数指定为显式是否有任何重要性?将方法/构造函数指定为显式有什么好处?

0 投票
5 回答
15151 浏览

c++ - 为什么显式允许默认构造函数和具有 2 个或更多(非默认)参数的构造函数?

我了解具有一个(非默认)参数的构造函数的行为类似于隐式转换器,它将该参数类型转换为类类型。但是,explicit可用于限定任何构造函数,没有参数的构造函数(默认构造函数)或具有 2 个或更多(非默认)参数的构造函数。

为什么在这些构造函数上允许显式?有没有什么例子可以用来防止某种隐式转换?

0 投票
2 回答
4184 浏览

c++ - c++复制初始化&直接初始化,奇怪的情况

在继续阅读本文之前,请阅读C++ 中复制初始化和直接初始化有区别吗?首先,确保你理解它在说什么。

我先在这里总结一下规则(阅读标准n3225 8.5/16、13.3.1.3、13.3.1.4和13.3.1.5),

1) 对于直接初始化,所有的构造函数都将被视为重载集,重载解析将根据重载解析规则选择最佳的一个。

2) 对于复制初始化,源类型与目的类型相同或派生自目的类型,规则同上,只是只有转换构造函数(无显式构造函数)才会被视为重载集。这实际上意味着显式复制/移动构造函数不会被考虑到重载集中。

3)对于上面(2)中没有包括的复制初始化情况(源类型与目的类型不同,不是从目的类型派生的),我们首先考虑用户定义的可以从源类型转换为目的类型的转换序列或(当使用转换函数时)到其派生类。如果转换成功,则使用结果直接初始化目标对象。

3.1) 在此用户定义的转换序列期间,将根据 8.5/16 和 13.3.1.4 中的规则考虑转换 ctor(非显式 ctor)和非显式转换函数。

3.2)结果纯右值将直接初始化目标对象,如(1)中列出的规则,见8.5/16。

好吧,规则说得够多了,让我们看看一些奇怪的代码,我真的不知道我的推理哪里错了,或者只是所有的编译器都错了。请帮助我,谢谢。

据我了解,对于(1),

因为C++有一个规则,函数返回是作为复制初始化的,根据上面的规则,2会先隐式转换为A,应该没问题,因为A有一个构造函数A(int)。然后转换后的临时prvalue将用于直接初始化返回的对象,这也应该没问题,因为直接初始化可以使用显式复制构造函数。所以 GCC 是错误的。

对于 (2),

在我的理解中,首先b被操作符A()隐式转换为A,然后转换后的值将用于直接初始化a,当然可以调用显式复制构造函数?因此这应该通过编译并且所有编译器都是错误的?

请注意,对于 (2),visual c++ 和 clang 都有类似于“错误,无法从 B 转换为 A”的错误,但如果我删除 A 的复制构造函数中的显式关键字,错误就消失了。

谢谢阅读。


编辑 1

因为还是有人没明白我的意思,所以我引用了 8.5/16 中的以下标准,

否则(即,对于剩余的复制初始化情况),可以从源类型转换到目标类型或(当使用转换函数时)到其派生类的用户定义转换序列被枚举,如 13.3 中所述。 1.4,最好的一个是通过重载决议(13.3)选择的。如果转换无法完成或不明确,则初始化格式错误。以初始化表达式作为参数调用所选函数;如果函数是构造函数,则调用初始化目标类型的 cv 非限定版本的临时版本。临时是prvalue。然后根据上面的规则,调用的结果(这是构造函数案例的临时结果)用于直接初始化,作为复制初始化目标的对象。在某些情况下,允许实现通过将中间结果直接构造到正在初始化的对象中来消除这种直接初始化中固有的复制;见 12.2、12.8。

请注意,它确实提到了用户定义转换后的直接初始化。这意味着,据我了解,以下代码应遵守我评论的规则,clang、coomeau online、visual c++ 都证实了这一点,但 GCC 4.4.3 (1)和(2)都失败了。虽然这是一个奇怪的规则,但它遵循标准的推理。

0 投票
3 回答
165 浏览

c++ - c++继承问题

我对此有一个问题:

能告诉我为什么main编译的最后一行吗?我传递了一个intintoB的构造函数,它需要一个A对象。我相信 theint被翻译成AinB的构造函数,但为什么呢?

提前致谢。

艾薇儿

0 投票
2 回答
2379 浏览

c++ - 在 C++ 中放置新的 VS 显式构造函数调用

最近我遇到了这两种在内存中特定位置创建对象的方法:
1。


2.

第二种方式有点短……还有其他区别吗?问候马特乌斯

0 投票
3 回答
1146 浏览

c++ - 显式标记所有 C++ 构造函数有什么缺点吗?

有几次,在重构代码的explicit时候,给以前的无参构造函数添加参数,或者从以前的多参数构造函数中删除参数时忘记添加关键字。为了防止这种情况,我养成了标记每个构造函数的习惯explicit,不管它有多少参数。(当然,我实际上想要隐式转换的那些构造函数除外。)

这有什么缺点吗?表现?编译时间?

0 投票
2 回答
2480 浏览

c++ - 用于隐式类型转换的 C++ 构造函数

我有这些代码:

据我了解,每个没有显式关键字的 Type2 的 1 参数构造函数应该意味着任何 Type1 对象或 int 值都可以隐式转换为 Type2 对象。

但在最后一行t2=t1; ,MS Visual Studio 给了我这个编译错误:

....错误 C2679:二进制“=”:未找到采用“Type1”类型右侧操作数的运算符(或没有可接受的转换)....

似乎 MS Visual Studio 坚持t2=t1; 必须匹配具有 lhs=Type2 和 rhs=Type1 的赋值运算符。为什么不能将 rhs 隐式转换为 t2 然后使用 Type2=Type2 运算符进行复制?

0 投票
5 回答
5646 浏览

c++ - Explicit move constructor?

The explicit keyword is recommended for all most constructors which can be called with one argument, except for copy constructors.

For copy constructors, it has an use (to forbid implicit copying via function call, return, etc), but it's not what's usually wanted.

What about move constructors? Is there any reasonable use case to make them explicit? What's the good practice here?

0 投票
3 回答
4601 浏览

c++ - 隐式定义的类的析构函数

考虑没有由开发人员明确声明的类的destructor情况constructor。我知道在这种情况下destructor将是一个班级。那么只有当类的一个对象即将被销毁时isimplicitly declared是真的吗?destructorimplicitly defined

构造函数的行为是否也和上面一样。是否implicitly defined仅在创建类的对象时?

编辑

在上面的代码中,~A() 将被隐式声明。我的问题是,只有当类的对象实例化为

或者它是隐式定义的,即使对象实例化没有完成?

0 投票
1 回答
646 浏览

c++ - 为什么这个显式析构函数会导致共享 ptr 中的内存损坏?

这段代码有什么问题,我该如何解决?

这段代码看起来像工作,并打印:

但有时程序崩溃和 valgrind 总是说:

我可以用 m_test.reset() 线修复这种行为,但我认为有一个更正确的解决方案......