const void (* 函数)
const void (* to function)
有什么区别吗:
void (* const algorithm)();
和
void const (* const algorithm)();
当处理const
指向静态方法的指针时?
我理解如果指针指向不应修改的内存,使用 const
是有意义的,在指向变量的指针的情况下,如 this answer 中所述。然而,函数地址在 运行 时间内不是有效的常数吗?
我问这个的原因是,作为函数参数的 second 选项不起作用。
编辑
这里是无法编译的代码。
struct A {
static void a() {}
};
void b(void const (* const callback)()) {}
int main() {
b(&A::a); // No matching function for call to 'b'
}
如果函数 a()
具有 return 类型 const void
.
,则以上示例有效
const
在 return 类型之后(或之前)适用于 return 类型。没有 "pointer to const function" 这样的东西,因为没有 const 函数这样的东西。 (虽然,存在指向 const 成员函数的指针,因为 const 成员函数确实存在。但是常量适用于对象参数,而不适用于函数本身。常量表示在与成员函数的声明相同 - 在带括号的参数列表之后).
void()
和 void const()
之间没有区别,因为两个函数的行为完全相同,因为 const void return 类型和非 const void return 类型之间没有行为差异-const void return 类型。当没有对象时,对象不能是常量。
我希望编译器在非class return 值直接用 const 限定时发出警告。
但是,void()
和 void const()
的不同之处在于 void
和 void const
在技术上是不同的类型,因为所有 const 限定类型都不同于它们的非-const 对应物。因此指向 const returning 和非 const returning 函数的函数指针是不同的函数指针类型。因此,该标准不允许将指向一种类型的函数指针绑定到另一种类型的函数。
因此,要修复您的非编译代码,只需在函数指针中将无意义的 void const
替换为 void
。
从 "inner" const
开始:
using void_function = void();
void (*p1)() = nullptr; // similar to `void_function* p1 = nullptr;`
void (* const p2)() = nullptr; // similar to `void_function* const p2 = nullptr;`
p2
是 constant
而 p1
是可变的。
移动const
时,如下:
const void_function* p3 = nullptr; // or void_function const* p3; // -> const has no effect
void (const* p4)() = nullptr; // Invalid syntax
没有“const
函数”与 "mutable function"。
现在,查看函数 return 类型:
类型void ()
(函数returning void
)和const void ()
(函数returning const void
!?)是不同的。
即使 const void
没有实际意义,它也是一个有效类型。
从函数 return const
对象禁止 "direct" 修改对象可能有意义:
const std::string make_const_string();
make_const_string().push_back('*'); // Doesn't work
std::string s = make_const_string(); // OK, create mutable copy.
所以要修复您的代码:
struct A {
static void a() {}
};
void b(void const (* const callback)()) {}
int main() {
b(&A::a); // No matching function for call to 'b'
}
您必须使 &A::a
匹配 b
的参数类型:
static const void a() {}
void b(void (*const callback)())
我建议第二个,因为 const void
没有实际意义。
有什么区别吗:
void (* const algorithm)();
和
void const (* const algorithm)();
当处理const
指向静态方法的指针时?
我理解如果指针指向不应修改的内存,使用 const
是有意义的,在指向变量的指针的情况下,如 this answer 中所述。然而,函数地址在 运行 时间内不是有效的常数吗?
我问这个的原因是,作为函数参数的 second 选项不起作用。
编辑
这里是无法编译的代码。
struct A {
static void a() {}
};
void b(void const (* const callback)()) {}
int main() {
b(&A::a); // No matching function for call to 'b'
}
如果函数 a()
具有 return 类型 const void
.
const
在 return 类型之后(或之前)适用于 return 类型。没有 "pointer to const function" 这样的东西,因为没有 const 函数这样的东西。 (虽然,存在指向 const 成员函数的指针,因为 const 成员函数确实存在。但是常量适用于对象参数,而不适用于函数本身。常量表示在与成员函数的声明相同 - 在带括号的参数列表之后).
void()
和 void const()
之间没有区别,因为两个函数的行为完全相同,因为 const void return 类型和非 const void return 类型之间没有行为差异-const void return 类型。当没有对象时,对象不能是常量。
我希望编译器在非class return 值直接用 const 限定时发出警告。
但是,void()
和 void const()
的不同之处在于 void
和 void const
在技术上是不同的类型,因为所有 const 限定类型都不同于它们的非-const 对应物。因此指向 const returning 和非 const returning 函数的函数指针是不同的函数指针类型。因此,该标准不允许将指向一种类型的函数指针绑定到另一种类型的函数。
因此,要修复您的非编译代码,只需在函数指针中将无意义的 void const
替换为 void
。
从 "inner" const
开始:
using void_function = void();
void (*p1)() = nullptr; // similar to `void_function* p1 = nullptr;`
void (* const p2)() = nullptr; // similar to `void_function* const p2 = nullptr;`
p2
是 constant
而 p1
是可变的。
移动const
时,如下:
const void_function* p3 = nullptr; // or void_function const* p3; // -> const has no effect
void (const* p4)() = nullptr; // Invalid syntax
没有“const
函数”与 "mutable function"。
现在,查看函数 return 类型:
类型void ()
(函数returning void
)和const void ()
(函数returning const void
!?)是不同的。
即使 const void
没有实际意义,它也是一个有效类型。
从函数 return const
对象禁止 "direct" 修改对象可能有意义:
const std::string make_const_string();
make_const_string().push_back('*'); // Doesn't work
std::string s = make_const_string(); // OK, create mutable copy.
所以要修复您的代码:
struct A {
static void a() {}
};
void b(void const (* const callback)()) {}
int main() {
b(&A::a); // No matching function for call to 'b'
}
您必须使 &A::a
匹配 b
的参数类型:
static const void a() {}
void b(void (*const callback)())
我建议第二个,因为 const void
没有实际意义。