我有一个功能,比如说
void *test_pointer = (void*) &myfunc;
如果我声明一个指针并将其分配给函数的地址如下
Name Value
&myfunc 0x000000013fc06570
test_pointer 0x000000013fa4786f
并使用Visual Studio进入调试模式,我将从观察窗口中获取以下内容
class MyClass {
public foo = 'asdf';
}
现在我希望这两个值相同,为什么不是这样?
答案 0 :(得分:8)
严格地说,C ++标准不需要实现来支持将函数指针转换为不透明对象指针(void*
)。你可能已经被告知void*
可以指向任何东西,但“任何东西”不一定是函数。
由于此功能仅受条件支持,因此无法确定如何进行此类转换。可能是您的实现只会在保留值(这是标准所要求的最低要求)的同时转换为void*
和从 <!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<script data-require="angular.js@1.5.x" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.11/angular.min.js" data-semver="1.5.11"></script>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<div class="col-md-3">
{{formatList | json}}
<select
class="form-control"
ng-model="formatList"
ng-options="item as item.fileFormat for item in (listsFormat | filter:exportMode|filter:listName|filter:fileExtension) track by item.fileFormat">
</select>
</div>
<div class="col-md-3">
<select
class="form-control"
ng-model="exportMode"
ng-options="item as item.exportMode for item in (listsExportMode| filter:formatList|filter:listName|filter:fileExtension) track by item.exportMode"></select>
</div>
<div class="col-md-3">
<select
class="form-control"
ng-model="listName"
ng-options="item.list.listId as item.list.listName for item in (listsName| filter:formatList|filter:listName|filter:fileExtension) track by item.list.listName"></select>
</div>
<div class="col-md-3">
<select
class="form-control"
ng-model="fileExtension"
ng-options="item as item.fileExtension for item in (listsFileExtension| filter:formatList|filter:listName|filter:fileExtension) track by item.fileExtension"></select>
</div>
</body>
</html>
转换。但是两个指针表示中的值不一定相同。
引用最新的C ++标准草案,[expr.reinterpret.cast]/8:
将函数指针转换为对象指针类型,反之亦然 有条件支持。这种转换的意义是 实现定义,但实现支持 双向转换,将一种类型的prvalue转换为 另一种类型和背面,可能具有不同的cv资格, 将产生原始指针值。