const更改没有const_cast <>为什么没有编译器警告/错误?

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,它就被接受.


use*_*670 5

这里没有问题.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 *)>函数对象的构造函数应该产生错误.