问题标签 [explicit-conversion]

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 投票
1 回答
233 浏览

c++ - 显式转换为 std::function

我正在尝试定义从某个类到这样的显式转换:std::function

但是当我编译它时,我得到以下错误:

0 投票
1 回答
693 浏览

c++ - 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?

一些(很多?)程序员被介绍给两者std::string_viewstd::string问自己:“为什么我可以将后者转换为前者,而不是反过来呢?”

问题的一部分在这里得到了回答:

为什么没有从 std::string_view 到 std::string 的隐式转换?

一个人可以喜欢或不喜欢的原因。但是 -显式构造函数呢?我在 cppreference.com的std::string构造函数页面上没有看到一个?

对有关隐式构造函数的问题的两个答案基本上都表明隐式构造函数会导致内存分配和内存复制,而程序员并不清楚这一点。好的,好吧,使用显式构造函数 - 程序员确实想要分配和复制。为什么不给他/她呢?

0 投票
1 回答
666 浏览

c++ - c++ 中无符号位长类型之间的隐式转换,即 uint8_t,uint16_t

我想知道在各种位的无符号整数(即 uint8_t、uint16_t 等)之间的表达式的情况下如何隐式转换工作以及显式避免它的方法。为此,我总结了以下案例:

  • 在 uint8_t 加法、减法、乘法、除法的情况下,隐式转换如何工作?

显式声明是 C= static_cast<uint16_t>A+B; 或 C= static_cast<uint16_t>(A+B);. 这是正确的吗?C= static_cast<uint16_t>A+B; 之间有什么区别吗?还是 C= static_cast<uint16_t>(A+B)?

  • 在 unsigned int(使用 U 文字)和 uint8_t 表达式的情况下,隐式转换如何工作?重要的顺序之间是否也有区别,即 1U B;(unsined int * uint8_t ) 或 B 1U;(uint8_t * uint8_t )

显式转换为 C= static_cast<uint16_t>A+1U; 或 C= static_cast<uint16_t>(A+1U); C= static_cast<uint16_t>1UB ;或 C= static_cast<uint16_t>(1UB );. 这是正确的这些行之间有什么区别吗?

  • 表达式的隐式转换如何工作。是否考虑到正常顺序?表达式的最终类型是什么?

在这种情况下 static_cast 应该如何看待?只有第一个变量(1U 或 C)将为其余变量定义 C= static_cast<uint8_t >(1U)/(A-1U);

  • 标准函数的隐式转换如何工作

显式转换为 C= static_cast<uint16_t>sizeof(A) 和 C= static_cast<uint16_t>abs(-1*A)。那是对的吗?C= static_cast<uint16_t>abs(-1)*A) 怎么样?

  • 函数参数的隐式转换如何工作。

显式转换为 C= sum(static_cast<uint16_t>(A),static_cast<uint16_t>(B-1U/2U))。那是对的吗?

我在 Opencv 中看到了一个类似于 static_cast 的函数,称为 saturate_cast。在上述任何情况下,这会是更好的解决方案吗?

0 投票
1 回答
170 浏览

c++ - 在 cpp 中为 double 和 string 数据类型定义运算符 +

我正在尝试使用以下函数为字符串和双精度定义运算符 +

当我进行以下操作时,它运行良好

但是当我传递 const char 而不是 string 时,它会引发编译错误('double' 和 'const char [4]' 类型的无效操作数到二进制 'operator+')

为什么 const char[] "sff" 到字符串的隐式转换没有发生?

0 投票
2 回答
91 浏览

c++ - 为什么非 const 引用不能初始化为不同类型的对象?

我正在读这本书,上面写着我们可以将一种类型的 const 引用分配给任何其他类型的对象,原因是内部编译器将 Rvalue 分配给与引用相同类型的对象,然后 const引用被初始化为相同类型的对象,但是,如果这种类型的隐式转换有助于将 const 引用分配给不同类型的对象,那么为什么不可能隐式地进行相同的转换,因为对于这种显式转换。

它的工作方式相同,为什么它没有在编译器中预先配置?

0 投票
2 回答
147 浏览

c++ - 为什么我们不能直接将 arr 分配给指向数组的指针

我有一个由 5 个整数组成的数组。arr 和 &arr 是相同的地址。那么为什么数字 2 给出编译错误并且 3 工作正常。

0 投票
2 回答
104 浏览

c++ - 为什么我们不能直接将二维数组的地址分配给指针?

为什么我们不能直接将二维数组的地址分配给指针?

有什么方法可以在一行中分配它,而不是借助for循环?

还有其他更好的方法吗?

0 投票
2 回答
70 浏览

c++ - 是否有意使用 std::pair 进行潜在危险的隐式转换?有没有办法避免它们?

我刚刚意识到这段代码编译得很好,但是在运行时有未定义的行为和(自然)崩溃:

这对我来说有点令人震惊,因为我很自然地假设'构造函数的explicit性质会阻止我意外地将 a 转换为,但似乎这种保护措施不再在一些转发给构造函数的包装器中起作用,例如.std::unique_ptr<T>T*T *std::unique_ptr<T>std::pair

所以我想我想知道一些事情:

  • 有没有很好的缓解方法?这是一个众所周知的问题吗?

  • 这些是故意的,还是应该被视为标准中的缺陷?

  • 如果是缺陷,应该进行哪些更正?可以在图书馆级别制作,还是需要更改语言?(例如,它是否需要explicit-ness 的可重载性?)

记住std::unique_ptr<int>只是一个例子;代码错误并不总是很明显,而且随着代码的模板化越多,预测潜在危险的转换就会变得越来越困难,所以我真的很想知道人们是如何处理这个问题的。

0 投票
2 回答
86 浏览

c++ - 'if (x)' 如何,其中'x' 是类的实例,而不是隐式转换?

根据 cppreference.com,显式转换函数不能用于隐式转换。作为一个例子,他们有这个:

我会认为'if(b2)'是一个隐式转换,因此无法使用显式转换函数。那么什么是不允许的隐式转换的例子呢?

0 投票
1 回答
139 浏览

c++ - 为什么我的显式构造函数会为我的转换运算符创建这种歧义?

我无法弄清楚为什么我的转换运算符正在考虑显式构造函数。

如果我像这样直接调用运算符:A<float> b = a.operator A<float>();那么它工作正常,所以我想知道是否有一些关于 static_cast<> 用于调用我不知道的转换运算符的规则。但是我发现很难理解的是,当我没有以任何方式显式调用它们时,为什么它甚至会考虑显式构造函数,据我所知。

我正在用 g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 编译