gpt4 book ai didi

c++ - 将 double 分配给结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:50 24 4
gpt4 key购买 nike

前几天我在一位同事的代码中偶然发现了一些东西,我想了解它是如何/为什么起作用的。

他使用这样的结构

 struct my_struct
{

my_struct(){ /* default constructor*/};
my_struct(char c){ /*some special constructor*/};
// other stuff
my_struct& operator=(const my_struct &ms){ /* assignment */};
};

最初通过一个打字错误,他发现以下是有效的

  my_struct ms;
double a;
ms = a;

我发现这等于(在给出相同的最终结构 ms 的意义上)以下内容

  my_struct ms;
double a;
my_struct ms2((char) a);
ms=ms2;

但我不知道为什么。就个人而言,我认为这不应该起作用,因为没有用于 double 和 my_struct 的赋值运算符,另外因为没有用于 my_struct 使用 double 的构造函数。

我试着用谷歌搜索这个,但没有找到任何相关的东西。

@ user657267:我想让它尽可能短,你可以添加一行 a=5;或任何适用的内容。

最佳答案

在编译过程中:

ms = a;

尝试解决以下一种或多种直接形式的赋值

my_struct& operator ()(double)
my_struct& operator ()(double&)
my_struct& operator ()(const double&)

以及来自 double 的一系列其他潜在转换。没有找到。事实上,只有以下发现:

my_struct& operator=(const my_struct &ms)

这表明编译器允许通过另一个 my_struct 的常量引用进行赋值。那时会寻找一个转换构造函数,从最直接的转换开始(显式转换为 double 类型:

my_struct(double)
my_struct(double&)
my_struct(const double&)

重要的是要注意这样的构造函数不能强制显式使用。我们正在隐式地构建一个临时的,因此明确的授权不在保留范围之内。

无论如何,还是没有找到。在放弃之前,编译器会尝试找到一个任何形式的构造函数,该构造函数可以将double转换为基本构造所需的任何形式并且所述构造函数支持隐式 build 。实际上,某种形式的东西

my_struct(<<something that can be converted from a double>>)

同样,构造函数不能显式。事实证明,此搜索确实找到了这个:

my_struct(char)

因为 double 可以转换为 char(虽然很差而且可能不是您想要的)。整个链条比这复杂一点(好吧,很多),但这是它的症结所在。

您可以通过确保构造函数在使用中仅显式 来避免这种隐式构造,但这是一把双刃剑,因此需要小心。 explicit 的使用可能有些苛刻。这样做:

explicit my_struct(char)

在将 double 转换为 char 时将抑制意外的隐式构造。但我警告你;它还将压制执行此操作的能力:

char x = 'a';
my_struct ms;
ms = x;

因为现在 my_struct 不能通过转换或其他方式从 char 隐式根本构造。有多种解决方法,包括为类型定义特定的赋值运算符(采用 double)或特定的转换构造函数(采用 double)。你如何处理我留给你的。

关于c++ - 将 double 分配给结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24626538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com