如何回答标准库函数是否是“可寻址函数”的问题?

问题描述 投票:0回答:2

我最近遇到了我可以获取标准库中定义的函数的地址吗?,我对答案基本上是感到震惊。我肯定至少在一些地方写过

&std::someTemplClass<SomeConcreteType>::someMember
,所以我应该复习所有这些,但我该怎么做呢?

来自标准的相关部分

[…] 除非

F
被指定为 可寻址函数,否则 C++ 程序的行为是未指定的 […]

感觉我必须搜索我所应用的所有

std::stuff
的标准并查找单词
“可寻址函数”
但是我如何确定我查看了给定

&

的正确页面?

链接的答案

肯定做了两个例子,但我仍然有一些疑问。 例如:

此外,如果 C++ 程序尝试形成对
std::stuff

的引用,或者尝试形成指定标准库非静态成员函数的指向成员的指针,则它的行为是未指定的(可能是格式错误的) ([member.functions]) 或标准库成员函数模板的实例。


这是否意味着
标准库非静态成员函数

标准库成员函数模板的实例化永远不是可寻址函数 如果是这种情况,我是否正确理解任何出现的

F

甚至只是

&std::someTemplClass<SomeConcreteType>::someNonStaticMemberFunc
都会传递给更高阶的函数,例如在这些情况下,
&std::someClass::someMemberFunc

有错吗?

如果它处于未评估的环境中呢,例如

doStuff(someRange | ranges::views::filter(&std::optional<int>::has_value)); std::transform(v.begin(), v.end(), w.begin(), boost::bind( &std::string::c_str, boost::placeholders::_1 ) );


请不要告诉我答案是
“你应该阅读标准

端到端:(

c++ language-lawyer std memory-address
2个回答
0
投票
Cppreference

有一个可寻址函数列表,并且它仅包含 iostream 操纵器。 所以,是的,您的示例是非法的,包括在未评估的上下文中(因为该规则的要点是能够悄悄地添加重载并更改其签名,只要调用语法看起来正常)。


0
投票

https://en.cppreference.com/w/cpp/language/extending_std#Addressing_restriction

可寻址函数只是为将用例传递给其他函数(通常作为引用)而设计的函数。这些(目前)都是与 IO 流相关的。所以这个列表很小。

是的,标准库模板没有可寻址的成员函数,也没有函数模板的可寻址特化。

您给出的所有示例都是不可寻址的,因此具有未指定的行为。这不是未定义的行为,所以它并没有那么糟糕。风险在于它可能无法在不同的编译器上编译,或者(不太可能)它可能选择错误的函数重载/专业化。

© www.soinside.com 2019 - 2024. All rights reserved.