【问题标题】:A simple question about type coercion in C++关于 C++ 中类型强制的一个简单问题
【发布时间】:2010-05-25 18:39:47
【问题描述】:

给定一个函数原型和一个类型定义:

int my_function(unsigned short x);
typedef unsigned short blatherskite;

以下情况是否按标准定义:

int main(int argc, char** argv) {
  int result;
  blatherskite b;

  b=3;
  result = my_function(b);
}

我是否可以通过函数原型可预测地获得类型强制?

【问题讨论】:

  • 我认为很简单,可以编译和尝试。我相信这会很好。
  • 只有强制(即隐式转换)发生在b=3 线上; 3 是 int 类型的文字,转换为赋值的无符号短整型。只是放弃这条线,这样人们就不会被这个不是关于强制而是更多关于typedef行为的问题弄糊涂了。

标签: c++ coercion


【解决方案1】:

如果你的问题真的是关于参数的类型和参数的类型是否匹配,那么答案是肯定的。 typedef 不会引入新类型,它只会为现有类型创建别名。变量b 的类型为unsigned int,就像参数一样,尽管b 是使用typedef-name blatherskite 声明的。

不过,您的示例并不能很好地证明这一点。所有整数类型在 C++ 中都可以相互转换,因此(忽略范围问题)即使blatherskite 指定了不同的类型(新类型),代码也会定义行为。但事实并非如此。所以这也是完全有效的

void foo(unsigned int* p);
...
blatherskite *pb = 0;
foo(pb); // <- still valid

【讨论】:

  • 这正是我想知道的。我很好奇你认为我可能会问其他什么问题。
  • 好吧,如果您认为类型不匹配,问题可能会有所不同:blatherskite 是否可以转换为 unsigned int
  • 啊,我明白了。在这种情况下,我确实相信类型匹配。这也许是问题之一。正如我在下面对杰瑞所说的,我有很多垃圾名字。我不知道我可以将 blatherskite 解释为 unsigned int,但如果我想将 unsigned int 解释为 blatherskite,我可能可以在采用 unsigned int 的单个参数构造函数上使用显式关键字。我很好奇这种转换是否会在我上面描述的情况下自动发生。 [在我迟到的会议之后],我会要求跟进。
【解决方案2】:

不需要类型强制。 typedef 只是同一类型的别名,因此您将 unsigned short 传递给采用 unsigned short 的函数。

【讨论】:

  • 谢谢杰瑞。在实际代码中,我可能有多达十个为特定内在类型命名的不同别名。这些名称已被大量使用脱离其语义上下文,这让我怀疑其可靠性。据报道它“有效”,但“有效”的定义非常模糊。 ['Works' 可能意味着“嘿,它已编译。”]
  • @David: 是的——一直在谈论添加一个“强 typedef”(这将创建一个新类型,而不仅仅是一个别名),但它还没有发生(并且可能永远不会发生) ——谁知道)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2011-03-06
相关资源
最近更新 更多