【发布时间】:2012-12-20 00:34:00
【问题描述】:
我遇到了一个非常奇怪的问题,我将其简化为以下测试用例:
#include <iostream>
#include <map>
#include <string>
struct Test
{
std::map<std::string, void (Test::*)()> m;
Test()
{
this->m["test1"] = &Test::test1;
this->m["test2"] = &Test::test2;
}
void test1() { }
void test2() { }
void dispatch(std::string s)
{
if (this->m.at(s) == &Test::test1)
{ std::cout << "test1 will be called..." << std::endl; }
else if (this->m.at(s) == &Test::test2)
{ std::cout << "test2 will be called..." << std::endl; }
(this->*this->m.at(s))();
}
};
int main()
{
Test t;
t.dispatch("test1");
t.dispatch("test2");
}
输出
test1 将被调用...
test1 将被调用...
当启用优化时,这真的很奇怪。怎么回事?
【问题讨论】:
-
以这种方式使用函数指针作为唯一标识“句柄”似乎有点不合时宜,正是出于这个原因。
-
@Mehrdad:因为问题是关于C++的,而且测试用例是用C++写的,而且C++和C是不同的语言,规则不同。
-
@LightnessRacesinOrbit 请保持建设性。 “我不关心任何想用谷歌搜索这个问题的人”和“现在改变它,但 IDK 改变它”听起来很自私。
-
@Mehrdad:我选择这句话并非没有先例。参见仙女座,其中 Trance 说“我不在乎骨头”,这并不意味着她对它们有明显的负面个人和情感依恋,而是她的经验和智慧并不重视它们,与声称相反附近的其他人认为这些骨头具有重要价值。同样,在这里我的意思只是,在我看来,正确标记问题比最大化搜索引擎点击更重要。否则,让我们也标记问题
php、java和mysql,让每个人 参与进来! =) -
@JamesMcNellis: Done! 如果您发现他们发布了我在一天左右没有注意到的后续内容,请随时联系我。
标签: c++ visual-c++ linker