c++ - 语法问题 :what does `char [5] const &` mean?

标签 c++ arrays string-literals

char [5] const & 是什么意思?

对 5 个字符数组的常量左值引用
或对 5 个常量字符数组的左值引用
或对 5 个字符的 const 数组的左值引用?

我正在阅读 C++ 编程语言书籍,并且我正在学习指向 char 的指针。我找到了这段代码:char s[] = "Gorm";,它提醒我字符串文字被隐式转换为 const char *

所以,我感到很困惑,LHS 和 RHS 不是同一类型。

我使用了来自 here 的在线编译器和代码了解编译器如何查看 LHS 和 RHS 的类型。然后,我发现 LHS 被视为 char[5] 而 RHS 被视为 char[5] const &

我可以解释 LHS,但是,我无法理解什么是“对 5 个字符的数组的常量左值引用”,甚至在将 LHS char s[] 隐式转换为char* s,什么是“对指向非 const char 的非 const 指针的常量左值引用”

左值引用不是按定义常量“它仅指初始化它的值”吗?那么,为什么我们在&之前需要const呢?

那么,不同类型的LHS和RHS如何赋值呢?

下面是代码,我用来获取LHS和RHS的类型:

#include < type_traits > 
#include < typeinfo > 
#ifndef _MSC_VER
    #include < cxxabi.h > 
#endif
#include < memory > 
#include < string > 
#include < cstdlib > 
#include < iostream > // std::cout

template < class T > std::string
type_name() {
    typedef typename std::remove_reference < T >:: typeTR;
    std::unique_ptr < char, void( *)(void *) > own(#ifndef _MSC_VER abi::__cxa_demangle(typeid(TR).name(), nullptr, nullptr, nullptr), #else nullptr, #endif std::free);
    std::string r = own != nullptr
        ? own.get()
        : typeid(TR).name();
    if (std::is_const < TR >:: value) 
        r += " const";

    if (std::is_volatile < TR >:: value) 
        r += " volatile";

    if (std::is_lvalue_reference < T >:: value) 
        r += "&";
     else if (std::is_rvalue_reference < T >:: value) 
        r += "&&";

    return r;
}

int & foo_lref();
int && foo_rref();
int foo_value();
int main() {
    int i = 0;
    const int ci = 0;
    char s[] = "Gorm";
    std::cout << "decltype(s) is " << type_name < decltype("Gorm") > () << '\n';
    std::cout << "decltype(i) is " << type_name < decltype(i) > () << '\n';
    std::cout << "decltype((i)) is " << type_name < decltype((i)) > () << '\n';
    std::cout << "decltype(ci) is " << type_name < decltype(ci) > () << '\n';
    std::cout << "decltype((ci)) is " << type_name < decltype((ci)) > () << '\n';
    std::cout << "decltype(static_cast<int&>(i)) is " << type_name < decltype(static_cast < int &> (i)) > () << '\n';
    std::cout << "decltype(static_cast<int&&>(i)) is " << type_name < decltype(static_cast < int &&> (i)) > () << '\n';
    std::cout << "decltype(static_cast<int>(i)) is " << type_name < decltype(static_cast < int > (i)) > () << '\n';
    std::cout << "decltype(foo_lref()) is " << type_name < decltype(foo_lref()) > () << '\n';
    std::cout << "decltype(foo_rref()) is " << type_name < decltype(foo_rref()) > () << '\n';
    std::cout << "decltype(foo_value()) is " << type_name < decltype(foo_value()) > () << '\n';
}

最佳答案

char [5] const & 不是有效类型。如果您发布的代码为您提供此输出,则代码已损坏。

以下是检查类型是否有效的方法:

using type = char [5] const &; // error: expected ';' before 'const'

字符串文字的实际类型是const char [N],但在这种情况下它并不重要。

C++ 有一个特殊的规则,允许使用字符串文字来初始化字符数组。就这样。


请注意,如果您将 decltype 应用于字符串文字,它将为您提供 const char (&)[N](对 的常量数组的引用字符)。但这不是文字的实际类型。

这听起来可能令人困惑,但表达式从来没有引用类型。变量可以,但表达式不行。请参阅:What expressions yield a reference type when decltype is applied to them?

如果 decltype(应用于表达式而不是变量时)为您提供左值引用类型,则表明该表达式是左值。 (右值引用表示一个 xvalue,缺少引用表示一个 prvalue)。

关于c++ - 语法问题 :what does `char [5] const &` mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58301755/

相关文章:

c++ - 将 auto_ptr 转换为 shared_ptr

c++ - 什么时候虚拟继承是一个好的设计?

JavaScript 将值添加到多维数组

ruby - 为什么这个 case 表达式不会导致语法错误?

arrays - 如果 char*s 是只读的,为什么我可以覆盖它们?

c++ - C/C++,你能把一个文件#include 到一个字符串文字中吗?

c++ - 在没有返回值优化的情况下将两个对象相加会创建多少个临时对象?

c++ - vector 最后一个元素的迭代器

javascript - 生成数组中变量的可能真值

python - 从python数组中分割偶数/奇数行的最短方法?