为什么这个reinterpret_cast在Visual Studio中失败?

时间:2018-03-02 00:12:55

标签: c++ visual-studio alias reinterpret-cast

我有一些代码(见下文),奇怪的是当我通过gcc运行代码时编译很好,但是当我在Visual Studio 2017中打开相同的文件时,我得到了一个编译器错误:

Error   C2440   'reinterpret_cast': cannot convert from '::size_t' to 'Alias'

以下是您可以尝试的最小示例。只需点击“新项目”,选择C ++ Windows控制台应用程序,插入此代码,然后尝试在默认的x86调试模式下编译:

#include "stdafx.h"
#include <cstddef>

typedef std::size_t Alias;

Alias makeAlias(std::size_t n)
{
    return reinterpret_cast<Alias>(n);
}

int main()
{
    std::size_t x = 1;
    Alias t = makeAlias(x);
    return 0;
}

奇怪的是,如果你将return语句更改为这个稍微复杂的变量,它确实会编译,所以看起来Visual Studio决定只允许reinterpret_cast指针类型:

return *(reinterpret_cast<Alias*>(&n));

这让我觉得Visual Studio的一个奇怪的决定,因为,根据cpp reference

  

与static_cast不同,但与const_cast类似,reinterpret_cast表达式不会编译为任何CPU指令。它纯粹是一个编译器指令,它指示编译器将表达式的位序列(对象表示)视为具有new_type类型。

所以至少在我看来,如果我试图在两种类型之间reinterpret_cast以完全相同的方式占用内存,那么reinterpret_cast就是所谓的。毕竟,顾名思义,我将“相同的位模式”重新解释为另一种类型。

我意识到reinterpret_cast主要是针对指针类型之间的转换,但我不明白为什么我应该被禁止在这种情况下使用它。在某种“使用正确工作的正确工具”的意义上,允许程序员将reinterpret_cast用于其预期目的,而不是强迫他们在static_cast时使用reinterpret_cast更有意义。这不是必要的(更不用说在这个过程中不必要地烧掉几个时钟周期)?

在允许Visual Studio禁止此操作的别名类型之间允许Reinterpret_cast是否存在某种危险?如果使用不当,main肯定会有危险,但我不明白为什么如果使用得当它会失败(除非我在这种情况下在“正确”使用的定义中缺少某些东西)。

1 个答案:

答案 0 :(得分:8)

  

# SuperMarket.py - This program creates a report that lists weekly hours worked # by employees of a supermarket. The report lists total hours for # each day of one week. # Input: Interactive # Output: Report. # Declare variables. HEAD1 = "WEEKLY HOURS WORKED" DAY_FOOTER = "Day Total " SENTINEL = "done" # Named constant for sentinel value hoursWorked = 0 # Current record hours hoursTotal = 0 # Hours total for a day prevDay = "" # Previous day of week notDone = True # loop control # Print two blank lines. print("\n\n") # Print heading. print("\t" + HEAD1) # Print two blank lines. print("\n\n") # Read first record dayOfWeek = input("Enter day of week or done to quit: ") if dayOfWeek == SENTINEL: notDone = False else: prevDay = dayOfWeek hoursWorked = input("Enter hours worked:") while notDone == True: dayOfWeek = input("Enter day of week or done to quit: ") hoursTotal = hoursTotal + int(hoursWorked) if prevDay != dayOfWeek: print("\t" + DAY_FOOTER + str(hoursTotal)) if dayOfWeek == "done": break else: prevDay = dayOfWeek #Include work done in the dayChange()function hoursTotal = 0 hoursWorked = input("Enter hours worked:") [C++14: 5.2.10/2]:运算符不应丢弃constness(5.2.11)。可以将积分,枚举,指针或指向成员类型的表达式显式转换为其自己的类型;这样的转换会产生其操作数的值。

由于reinterpret_cast是一个整数类型,而std::size_t Alias,我说这是一个有趣的Visual Studio错误。< / p>