为什么我们的类型不匹配?

Con*_*nst 4 c++ templates type-deduction

我编写了一个程序来查看如何在模板函数中推导出字符串文字.

#include <iostream>
#include <string>
#include <type_traits>

template<typename T> void passByValue(T by_value)
{
    std::cout << std::is_same_v<char const*, decltype(by_value)> << std::endl; // okay
}

template<typename T> void passByReferance(T &by_ref)
{
    std::cout << std::is_same_v<char const*, std::remove_reference_t<decltype(by_ref)>> << std::endl;
}

template<typename T> void passByConstRef(const T &const_ref)
{
    std::cout << std::is_same_v<char const*, std::remove_const_t<std::remove_reference_t<decltype(const_ref)>>> << std::endl;
}

int main()
{
    std::cout << std::boolalpha;
    passByValue("string");    // true: good
    passByReferance("string");// false ??
    passByConstRef("string"); // false ??
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

事实证明,只有passByValue推断出字符串文字才能const char*输入.

在其他两种情况下(passByReferancepassByConstRef),如果我们应用于推导出的参数,std::remove_reference_t并且std::remove_const_t,我们想要得到的是const char*,那是正确的吗?

当我使用完成衰变时,我得到一个类型匹配std::decay_t,为什么?

Fra*_*eux 7

你逝去的const char[7]不是const char *.数组和指针不是一回事.它们经常被混淆,因为数组很容易衰减到指向它们的第一个元素的指针.通过引用获取时,数组不需要衰减到指针.只有在第一种情况下,您的数组才需要衰减到指针.

以下测试true针对每种情况生成:

#include <iostream>
#include <string>
#include <type_traits>

template<typename T> void passByValue(T by_value)
{
    std::cout << std::is_same_v<char const*, decltype(by_value)> << std::endl; 
}

template<typename T> void passByReferance(T &by_ref)
{
    std::cout << std::is_same_v<char const[7], std::remove_reference_t<decltype(by_ref)>> << std::endl;
}

template<typename T> void passByConstRef(const T &const_ref)
{
    std::cout << std::is_same_v<char [7], std::remove_const_t<std::remove_reference_t<decltype(const_ref)>>> << std::endl;
}

int main()
{
    std::cout << std::boolalpha;
    passByValue("string");    
    passByReferance("string");
    passByConstRef("string"); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:至于std::decay,它明确地导致数组类型衰减到指针:

如果T名称类型为"array of U"或"reference of array of U",则成员typedef类型为U*.

  • @JoeyMallone不要使用普通数组,你永远不必担心这一点.`std :: array`和`std :: string` /`std :: string_view`应该足够了. (6认同)