问题标签 [conversion-operator]

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 回答
154 浏览

c++ - 可接受的编程实践 - 转换和向上转换

以下是可接受的编程实践:

什么原因可以接受/不可接受?

(请避免提出关于在 TestA 中创建 TestB 赋值运算符的明显建议——这是关于是否应该或不应该以这种方式使用向上转换和/或转换运算符的问题)。

我还鼓励在评论中留下反馈以进行问题赞成/反对,以便我将来改进我的问题。

0 投票
3 回答
482 浏览

c++ - C++ 转换运算符和重载决议

给定这个例子,其中包括一些重载:


及其输出:


我的问题是 - 为什么void operator <<(A<T> &, const void *)要求发表声明test << source;?任何人都可以引用涵盖此案例的标准的特定部分吗?

0 投票
2 回答
148 浏览

c++ - 在这种情况下转换运算符是否有效?

通常,书籍通常不鼓励在包装 c 结构时使用转换运算符。例如,c++ 字符串(被认为是)是 C 字符数组的包装器,它不提供转换运算符。相反,它给出了方法c_str()

但是,我认真地认为我的情况可能是个例外。我正在总结一个SDL_Surface.Here's class声明。

在这种情况下,我认真地认为我应该添加一个转换运算符,SDL_Surface*以便与其他需要SDL_Surface*.

你觉得怎么样:

  1. 转换操作员会谨慎吗?
  2. 或者我应该使用类似的方法c_str()吗?
  3. 还是有其他更好的解决方案?
0 投票
2 回答
1066 浏览

c++ - 使用 static_cast 实现的转换运算符

在我在这里提出的问题之后,我提出了这个问题。

要点很简单。假设您有两个此类:

然后假设你有一个像这样的类型转换:

问题是:这种转换的标准符合行为应该是什么?

它应该与堆栈溢出相同const T & val(static_cast<const T &> (param) ) 还是应该递归迭代?请注意,我获得了使用 GNU 编译的第一个行为g++和使用 Intel 编译的第二个行为icpc

我已经尝试查看标准(关于 static_cast 的第 5.9 节和关于转换的第 12.3 节),但由于缺乏经验,我无法找出答案。

我非常感谢任何花时间帮助我解决这个问题的人。

0 投票
1 回答
5053 浏览

c++ - C++ 隐式转换运算符优先级

编辑:根据 Mike Seymour 的评论,我相应地替换operator std::string () const;operator char * () const;更改了实现。这允许隐式转换,但由于某种原因,unsigned long int 运算符优先于 char * 运算符,这感觉不太对……另外,我不想在外部暴露像 char * 这样讨厌的 C 东西类,当我有 std::string 时。我有一种预感,我的 CustomizedInt 类需要从某些东西继承以支持我想要的功能。有人可以详细说明迈克的评论std::basic_string吗?我不确定我是否理解正确。


我有这段代码:

打印“调用运算符 unsigned long int; 123”。我的问题是:

  1. 删除运算符 unsigned long int 后,为什么需要将 x 显式转换为 std::string?为什么它不直接调用隐式转换运算符(std::string)?
  2. 是否有任何文档解释允许哪些隐式转换以及它们的优先顺序?似乎如果我将运算符 unsigned int 与运算符 unsigned long int 一起添加到此类,我会收到有关 << 运算符歧义的编译器错误...
  3. 另外,我知道定义这样的运算符可能是不好的做法,但我不确定我是否完全理解相关的警告。有人可以概述一下吗?只定义公共方法 ToUnsignedLongInt 和 ToString 会更好吗?
0 投票
2 回答
124 浏览

.net - .net 运算符重载???类型转换运算符,它是如何工作的?

我第一次在 .Net 中遇到运算符重载,很久以前我在 C++ 中使用过它,但这就像重载运算符,如“+”,现在我突然遇到如下情况。

我有一个结构AccessToken

我知道第一种方法是构造函数,但我想知道第二种方法在做什么?绝对是某种运算符重载。我阅读了http://msdn.microsoft.com/en-us/library/s53ehcz3(v=vs.71).aspx但无法得到确切的想法。

0 投票
4 回答
2678 浏览

c++ - Ambiguous string::operator= 调用隐式转换为 int 和 string 的类型

给定以下程序:

它可以在 Visual Studio 11 上编译,但不能在 clang 或 gcc 上编译。它遇到了麻烦,因为它想隐式地从 a 转换为 a GenericTypeintchar它也可以返回 a string,因此存在歧义(operator=(char)并且operator=(string)两者都匹配GenericType)。

但是,复制构造函数很好。

我的问题是:如何在不修改 main 内容的情况下解决这种歧义?我需要做些什么来修改GenericType以处理这种情况?

0 投票
1 回答
1687 浏览

c++ - 指针转换,不能将 Two* 转换为 One*

假设我有两个班级,一和二。一和二本质上是一样的,但是二可以转换成一。

二可以访问一,但一无权访问二。在 main.cpp 我有:

如果我尝试将 One 的指针指向 Two 的地址,则会出现错误。错误是“错误 C2440:'正在初始化':无法从 '两个 *' 转换为 '一个 *'”

如果可能的话,我终其一生都无法弄清楚如何做到这一点。任何帮助,将不胜感激。

编辑:在 Two.h 中添加了一个新行,带有operator One& () const { return *this; }. 我试图用来让这个转换运算符工作的函数是void TestRefConstPrint(const One &testClass);下面的 main,这会出现一个新错误,即“无法将参数 1 从二”转换为“常量一 &”。

我在里面做:

0 投票
2 回答
1050 浏览

c++ - 如何对结构进行位操作?

我有一个位域结构,我想在其上使用掩码执行按位运算。我想知道最简单、最有效的方法。我尝试使用我的转换运算符(这似乎是对两个结构执行 & 操作的一种低效方式),但我收到错误 C2440:'type cast':无法从 'const test::dtType' 转换为 'char'。没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符

我尝试使用 void 指针进行按位运算。它可以编译,但我还没有测试过。

这是否尽可能高效?它涉及三个额外的指针,而我真正需要的只是转换为 long。

0 投票
1 回答
1052 浏览

c++ - 通过初始标准转换序列区分用户定义的转换序列

该标准似乎提供了两条规则来区分涉及用户定义的转换运算符的隐式转换序列:

13.3.3 最佳可行函数[over.match.best]

[...] 一个可行函数 F1 被定义为比另一个可行函数 F2 更好的函数,如果 [...]

  • 上下文是通过用户定义的转换(参见 8.5、13.3.1.5 和 13.3.1.6)进行的初始化,从 F1 的返回类型到目标类型(即,正在初始化的实体的类型)的标准转换序列是比从 F2 的返回类型到目标类型的标准转换序列更好的转换序列。

13.3.3.2 对隐式转换序列进行排名[over.ics.rank]

3 - 两个相同形式的隐式转换序列是不可区分的转换序列,除非以下规则之一适用:[...]

  • 如果用户定义的转换序列 U1 包含相同的用户定义的转换函数或构造函数或聚合初始化,并且 U1 的第二个标准转换序列优于第二个标准转换序列,则用户定义的转换序列 U1 是比另一个用户定义的转换序列 U2 更好的转换序列U2 的。

据我了解,13.3.3 允许编译器区分不同的用户定义的转换运算符,而 13.3.3.2 允许编译器区分不同的函数(某些函数的重载f),每个函数都需要在其参数中进行用户定义的转换(请参阅我的侧边栏给定以下代码(在 GCC 4.3 中),为什么要调用两次引用转换?)。

是否有其他规则可以区分用户定义的转换序列?https://stackoverflow.com/a/1384044/567292的答案表明 13.3.3.2:3 可以根据隐式对象参数(到转换运算符)的 cv 限定或构造函数或聚合初始化的单个非默认参数,但我看不出这有什么关系,因为这需要在相应用户定义的转换序列的第一个标准转换序列之间进行比较,而标准没有t 似乎没有提及。

假设 S1 优于 S2,其中 S1 是 U1 的第一个标准转换序列,S2 是 U2 的第一个标准转换序列,是否可以得出 U1 优于 U2?换句话说,这段代码格式正确吗?

g++ (4.5.1)、Clang (3.0) 和Comeau (4.3.10.1) 接受它,更喜欢 non-const-qualified A::operator int(),但我希望它会因为模棱两可而被拒绝,因此格式不正确。这是标准的缺陷还是我对它的理解?