问题标签 [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 投票
3 回答
1079 浏览

c++ - 从 int 到向量的隐式转换?

vector<T>有一个构造函数,它采用向量的大小,据我所知它是显式的,这可以通过以下代码无法编译的事实来证明

我无法理解并要求您解释的是以下代码编译的原因

它不仅可以编译,它实际上将图形调整为 5 并将每个元素设置为五个零的向量,即与我通常编写的代码相同:

如何?为什么?

编译器:MSVC10.0


好的,似乎这是一个 MSVC 错误(又一个)。如果有人可以详细说明答案中的错误(即总结复制它的情况),我很乐意接受

0 投票
4 回答
131 浏览

c++ - 我可以将隐式初始化重载为 0 吗?

是否可以编写一个使这些有效的类:

但这些不是:

本质上,我的规则是“一个常量0可以隐式转换为 a Foo,但没有其他值”

0 投票
4 回答
731 浏览

c++ - 什么时候不调用 c++ 构造函数?

我有一种情况,似乎没有调用构造函数:

输出是:

(注:Hello2 和 Hello3 之间没有任何关系)

如果我将程序更改为如下所示:

(唯一的区别在于 /* 1 */ 标记的行)

现在的输出是:

现在在 Hello2 和 Hello3 之间有一个构造函数调用。我的问题是,为什么在第一种情况下没有(可见的)构造函数调用?

0 投票
2 回答
1345 浏览

c++ - 显式非单参数构造函数

谁能解释为什么非单参数构造函数标记为显式编译?据我了解,这在这里绝对是无用的关键字,那么为什么编译时不会出错?

0 投票
1 回答
486 浏览

c++ - 这不是复制初始化,或者是吗?

在下面的代码中,我不允许声明显式ctor,因为编译器说我在复制初始化上下文(clang 3.3 和 gcc 4.8)中使用它。我试图通过使 ctor 不显式然后将复制构造函数声明为已删除来证明编译器是错误的。

编译器错了还是有其他解释?

更新一个不切实际但简单得多的版本

0 投票
2 回答
126 浏览

c++ - C++ - 当没有明显的构造函数匹配时,为什么这段代码会编译?

请考虑以下代码:

我的问题涉及第 (1) 行。这与我花了一些时间才找到的错误非常相似。由于复制/粘贴错误,我没有注意到该类型被指定了两次。正确的行显然是:

有趣的是,此更改似乎也可以无警告地编译:

为什么这些示例编译时没有使用 clang 的警告,即使使用了-Wall -Weverything标志?为什么Foo::Foo(double)接受 Foo 的实例作为有效double参数?这是 operator new 的一些特殊行为吗?

我的原始代码位于更大的上下文中,并使用两个基于 LLVM-3 的编译器进行了测试。两者都在没有警告或错误的情况下编译。有了一个,代码实际上按我的预期运行,事实上我有一段时间没有意识到有一个错误。另一方面, Foo 的实例表现得非常奇怪 - 我无法正确描述它 - 就好像返回指针的后续副本“神奇地”变成了与原始值不同的值,导致两个合作之间的状态不匹配应该持有指向共享 Foo 的等效指针的对象,但由于某种原因在分配后持有不同的值。直到我明白这里发生了什么,这似乎真的很奇怪!

有趣的是,以下两种编译器都可以编译:

但以下版本没有:

0 投票
1 回答
3405 浏览

c++ - 为什么带有 unsigned long long 参数的 std::bitset 构造函数未标记为显式?

标准库类模板std::bitset<N>有一个构造函数(C++11 及更高版本,unsigned longC++11 之前的参数)

与许多最佳实践指南相反,此单参数构造函数未标记为explicit. 这背后的原因是什么?

0 投票
3 回答
1571 浏览

c++ - C++11:使用“= {}”的类内初始化不适用于显式构造函数

在 C++11 中,我们可以使用“brace-or-equal-initializer”(标准中的词)进行类内初始化,如下所示:

但是如果我们取消注释explicit,它就不再编译了。GCC 4.7 和 4.9 是这样说的:

我发现这很令人惊讶。这段代码不能编译真的是 C++11 标准的意图吗?

删除=修复它:Foo foo { 42 };但我个人觉得这很难向几十年来习惯于这种形式的人解释=,而且由于标准指的是“大括号或相等初始化器”,为什么好的旧方法并不明显在这种情况下不起作用。

0 投票
2 回答
77 浏览

c++ - 在 C++ 中使用“显式”关键字未获得预期的行为

我有以下课程

根据我对显式的理解,每当调用 xyz 构造函数时,我都应该得到一个编译器错误;因为我通过简单地将obj_abc分配给一个字符串来初始化它。但我在这里没有得到任何编译器错误。我错过了什么?

0 投票
2 回答
1208 浏览

c++ - C++'没有匹配的调用函数'和'没有已知的参数转换'

我有这段代码:

我必须更改代码以将所有代码都放在一个文件中,因此不必担心与定义和内存分配分开实现。我将修复原始文件中的所有内容。我的问题是为什么编译这段代码我有这个消息:

test.cc:在函数'int main()'中:test.cc:86:40:错误:没有匹配函数调用'Cfp::Cfp(GlobalPortId (&)(PortId), CfpDevice*&)' Cfp cfp = 新 Cfp(端口,cfp_device);^ test.cc:86:40: 注意:候选人是:test.cc:70:12: 注意:Cfp::Cfp(const GlobalPortId&, CfpDevice ) 显式 Cfp(const GlobalPortId &id, ^ test.cc:70:12:注意:从 'GlobalPortId(PortId)' 到 'const GlobalPortId&' 的参数 1 没有已知的转换 test.cc:68:7: 注意: Cfp::Cfp(const Cfp&) class Cfp { ^ test.cc:68:7:注意:候选人期望 1 个参数,提供 2 个参数

但是,如果我改变:

为了

有用。

另外,如果我删除

并在 Cfp 创建中实例化:

它也有效。

有没有人可以解释一下:

  1. 为什么允许实例化 Cfp,在同一行调用 GlobalPortId 和 PortId 构造函数?但是单独实例化它们时是不允许使用的。
  2. 为什么不允许使用不强制转换的“端口”实例化 Cfp?