C++ 关于C++;

C++ 关于C++;,c++,coercion,C++,Coercion,给定函数原型和类型定义: 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); } 我是否可以通过函数原型预测到类型强制?如果您的问题是关于参数和参数的类型是否匹配,那么答案是肯

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

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);
}

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

如果您的问题是关于参数和参数的类型是否匹配,那么答案是肯定的
typedef
不引入新类型,它只为现有类型创建别名。变量
b
具有类型
unsigned int
,与参数类似,即使
b
是使用typedef name
blatherskite
声明的

不过,你的例子并不能很好地证明这一点。所有的积分类型都可以在C++中相互转换,因此(忽略范围问题),即使代码< BraskStITe>代码>指定不同类型(新类型),代码也会定义行为。但事实并非如此。所以这也是完全正确的

void foo(unsigned int* p);
...
blatherskite *pb = 0;
foo(pb); // <- still valid
void foo(无符号int*p);
...
布拉特石*pb=0;

foo(pb);// 不需要类型强制。typedef只是同一类型的别名,因此您要将一个
无符号short
传递给一个函数,该函数接受一个
无符号short

,我认为这足够简单,可以编译并尝试。我相信这会很好。只有强制(即隐式转换)在第
b=3行发生;3是int类型的文本,转换为赋值的无符号缩写。放下这句话,这样人们就不会被这个问题弄糊涂了,这个问题不是关于强制的,而是关于
typedef
行为的。这正是我想知道的。我很好奇你认为我可能会问什么其他问题。如果你认为类型不匹配,问题可能会不同:《布拉斯凯特》
是否可转换为
无符号整数?
?啊,我明白了。我相信在这种情况下,类型匹配。这可能是问题之一。正如我在下面告诉杰瑞的,我有很多垃圾名字。我不知道我是否可以将一个blatherskite解析为一个无符号int,但是如果我想将一个无符号int解析为一个blatherskite,我可能会在一个接受无符号int的单参数构造函数上使用explicit关键字。我很好奇,在我上面描述的情况下,这种转换是否会自动发生。我会(在我迟到的会议之后)再问这个问题。谢谢杰瑞。在实际的代码中,我可能有多达十个不同的别名,它们是为特定的内在类型命名的。这些名字在语义上下文之外被使用得太多了,这让我怀疑它们的可靠性。据报道,它“有效”,但“有效”的定义非常模糊。['Works'可能意味着“嘿,它已经编译了。”]@David:是的——有人说要添加一个“强typedef”(这将创建一个新类型,而不仅仅是一个别名),但它还没有发生(而且可能永远不会发生——谁知道呢)。