使用全局引用调用函数时的访问冲突

时间:2018-02-15 21:56:52

标签: c++ visual-c++ runtime-error access-violation compiler-bug

我正在测试存储和使用名为#include <iostream> using Function = void (&)(void); // Reference to Function void foo(void) { std::cout << "Foo called succesfully" << std::endl; } 的函数的函数引用的多种方式。

foo

首先,我尝试在Holder类的静态成员中存储对class Holder { public: static const Function class_foo; }; Function Holder::class_foo = foo; 的直接引用:

foo

其次,我尝试在全局变量中存储对Function global_foo1 = foo; 的直接引用:

const Function& global_foo2 = Holder::class_foo;

第三,我试图在Holder类中存储对其静态引用的引用:

Function global_foo3 = Holder::class_foo;

第四,我试图在Holder类中存储其静态引用的副本:

foo

尝试使用第3(global_foo2)和第4(global_foo3)个案件执行int main(void) { const Function& local_foo = Holder::class_foo; local_foo(); // Executes Properly Holder::class_foo(); // Executes Properly global_foo1(); // Executes Properly global_foo2(); // Throws Exception -> Access Violation when Executing global_foo3(); // Throws Exception -> Access Violation when Executing return 0; } 时发生访问冲突异常。

{{1}}

知道我做错了什么吗?可能是因为我对编译步骤缺乏了解。

Obs:只需按顺序复制每个代码块即可执行完整代码。我的编译器是Microsoft Visual Studio 15.5.2。还尝试了最新版本15.5.6。仍然无法在15.9.4版中运行。例外证明为herehere

1 个答案:

答案 0 :(得分:1)

代码使用GCC正确编译和执行。它必须是MSVC编译器错误或错误的编译器配置。