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 数组的输出的主要内容,如果未能解决你的问题,请参考以下文章