const 指针和 const 数组的输出

Posted

技术标签:

【中文标题】const 指针和 const 数组的输出【英文标题】:output of const pointer and const array 【发布时间】:2016-01-19 07:21:16 【问题描述】:

当我们有两个运算符用于输出一个对象和一个对象数组,并尝试输出常量对象数组时,涉及到对象运算符。有没有办法强制数组的运算符与常量对象的 c 数组一起工作?

示例代码:

#include <iostream>
#include <cstddef>

using std::size_t;

namespace nm

  struct C  int i; ;

  template <size_t N>
  using c_c_array = C[N];

  inline std::ostream& operator << (std::ostream& lhs,  C const*)  return lhs << "1\n"; 

  template <size_t N>
  inline std::ostream& operator << (std::ostream& lhs,  c_c_array<N> const&)  return lhs << "2\n"; 



int main()

  nm::C c1;

  nm::C arr[5];

  nm::C const c_const1;

  nm::C const arr_const[5] 1, 1, 1, 1, 1;

  std::cout << &c   // 1 - ok
            << arr  // 2 - ok
            << &c_const   // 1 - ok
            << arr_const; // 1 --ups

  return 0;

输出:1 2 1 1

此外,在我的例子中,2 运算符使用 1 进行输出。

【问题讨论】:

将初始化程序添加到您的代码中,以便人们停止回答错误的问题,即c_const;arr_const[5]; 对于所提出的问题,它是如何初始化的并不重要。如果它是未初始化的或已初始化的操作符 1 将被调用。这只是一个示例,我没有使用该常量,只是为了说明运算符如何调用的顺序 呃。你看到人们给你的答案了吗?这就是你要找的吗?.. @Rostislav 我已经多次更改示例。但实际上,第一个代码编译并工作,第二个只是复杂,问题并没有解决。 您的原始代码无法在在线编译器中编译 (example)。要修复它,您不需要添加您所做的所有内容。您只需在两行中添加。现在示例编译完成,您可能会得到您实际提出的问题的答案。 【参考方案1】:

根据草案标准N45278.5/p7.3 Initializers [dcl.init]Emphasis Mine):

否则,不执行初始化。

如果程序要求 const 限定类型 T, T 的对象的默认初始化 应该是具有用户提供的默认构造函数的类类型

因此,您必须为 class C 定义一个默认构造函数才能解决此问题。

【讨论】:

【参考方案2】:

我现在会做如下所示的事情。如果有人知道更好的解决方案,请写出来。

#include <iostream>
#include <cstddef>
#include <type_traits>

using std::size_t;

namespace nm

  struct C  int i; ;

  template <size_t N>
  using c_c_array = C[N];

  template<typename T>
  inline
  std::enable_if_t<std::is_same<T, C*>::value || std::is_same<T, C const*>::value,
  std::ostream&>
  operator << (std::ostream& lhs,  T const&)  return lhs << "1\n"; 

  template <size_t N>
  inline std::ostream& operator << (std::ostream& lhs,  c_c_array<N> const&)  return lhs << "2\n"; 



int main()

  nm::C c1;

  nm::C arr[5];

  nm::C const c_const1;

  nm::C const arr_const[] 1,2,3,4,5;

  std::cout << &c   // 1 - ok
            << arr  // 2 - ok
            << &c_const   // 1 - ok
            << arr_const; // 1 --ups

  return 0;

【讨论】:

以上是关于const 指针和 const 数组的输出的主要内容,如果未能解决你的问题,请参考以下文章

const

const关键字与数组指针

如何利用指针改变const类型的值

const

const

C++ const 学习