dgn*_*uff 5 c++ const language-lawyer
演示此问题的代码示例:
#include <functional>
#include <set>
void useCallback(std::function<void(char *)> callback)
{
}
int main()
{
std::function<void(char const *)> callback = [](char const *)
{
};
useCallback(callback);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,在const一天结束时删除是良性的,useCallback()在其API中声明它准备接受并使用修改其参数的回调,因此它可以很好地使用没有的函数.
那么为什么阻止传递std::set<char *>给期望std::set<char const *>不适用的函数的参数呢?该参数正确指出char *并且char const *是不同的类型,因此这两个集不是类型等价的.
牢记这一点,为什么不考虑不同的类型callback和参数useCallback()?
- 编辑 -
这是使用MSVC,VS 2017.
小智 9
该参数正确指出
char *并且char const *是不同的类型,因此这两个集不是类型等价的.
std::function<void(char *)>并且std::function<void(char const *)>也是不同的类型,因此两个函数对象不是类型等价的.它与...不同std::set,它们不需要等同于类型!
std::function<void(char *)>有一个构造函数,它将接受可以使用char *参数调用的任何对象.std::function<void(char const *)>可以用char *参数调用,所以没关系.这是std::function<T>从lambda 初始化时使用的相同构造函数:类型也不同,但只要在传递参数类型时可以调用lambda T,它就被接受.
这里没有问题.const实际上并没有被丢弃,因为调用std::function<void(char const *)>适合std::function<void(char *)>(即提供char *参数)参数的函数是完全正常的.错误的情况将是相反的情况:
void useCallback(std::function<void(char const *)> callback)
{
}
int main()
{
std::function<void(char *)> callback = [](char *)
{
};
useCallback(callback);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
std::function<void(char *)>不能使用适合std::function<void(char const *)>调用的参数调用.因此,std::function<void(char const *)>函数对象的构造函数应该产生错误.
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |