使用全局引用调用函数时发生访问冲突
Access violation when calling a function using a global reference
我正在测试多种存储和使用名为 foo
的函数的函数引用的方法。
#include <iostream>
using Function = void (&)(void); // Reference to Function
void foo(void)
{
std::cout << "Foo called succesfully" << std::endl;
}
首先,我尝试将对 foo
的直接引用存储在 Holder class:
的静态成员中
class Holder {
public:
static const Function class_foo;
};
Function Holder::class_foo = foo;
其次,我试图在全局变量中存储对 foo
的直接引用:
Function global_foo1 = foo;
第三,我试图在 Holder class:
中存储对其静态引用的引用
const Function& global_foo2 = Holder::class_foo;
第四,我尝试将其静态引用的副本存储在 Holder class:
Function global_foo3 = Holder::class_foo;
尝试使用第 3 种 (global_foo2
) 和第 4 种 (global_foo3
) 情况执行 foo
时发生访问冲突异常。
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;
}
知道我做错了什么吗?可能是因为我对编译步骤不了解。
Obs:只需按顺序复制每个代码块即可执行完整代码。我的编译器是 Microsoft Visual Studio 15.5.2。还尝试了最新版本 15.5.6。仍然无法在 15.9.4 版中使用。异常证明是here or here.
代码使用 GCC 编译和执行正确。它必须是 MSVC 编译器错误或错误的编译器配置。
我正在测试多种存储和使用名为 foo
的函数的函数引用的方法。
#include <iostream>
using Function = void (&)(void); // Reference to Function
void foo(void)
{
std::cout << "Foo called succesfully" << std::endl;
}
首先,我尝试将对 foo
的直接引用存储在 Holder class:
class Holder {
public:
static const Function class_foo;
};
Function Holder::class_foo = foo;
其次,我试图在全局变量中存储对 foo
的直接引用:
Function global_foo1 = foo;
第三,我试图在 Holder class:
中存储对其静态引用的引用const Function& global_foo2 = Holder::class_foo;
第四,我尝试将其静态引用的副本存储在 Holder class:
Function global_foo3 = Holder::class_foo;
尝试使用第 3 种 (global_foo2
) 和第 4 种 (global_foo3
) 情况执行 foo
时发生访问冲突异常。
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;
}
知道我做错了什么吗?可能是因为我对编译步骤不了解。
Obs:只需按顺序复制每个代码块即可执行完整代码。我的编译器是 Microsoft Visual Studio 15.5.2。还尝试了最新版本 15.5.6。仍然无法在 15.9.4 版中使用。异常证明是here or here.
代码使用 GCC 编译和执行正确。它必须是 MSVC 编译器错误或错误的编译器配置。