gpt4 book ai didi

c++ - Const temporary from template type 以及为什么使用 std::add_const?

转载 作者:可可西里 更新时间:2023-11-01 16:37:40 24 4
gpt4 key购买 nike

以下代码摘自cppreference.com .

#include <iostream>
#include <type_traits>

struct foo
{
void m() { std::cout << "Non-cv\n"; }
void m() const { std::cout << "Const\n"; }
};

template <class T>
void call_m()
{
T().m();
}

int main()
{
call_m<foo>();
call_m<std::add_const<foo>::type>();
}

但是,当使用 VC++ Nov 2012 CTP 编译时,输出为

Non-cv

Non-cv

而不是预期的:

Non-cv

Const

另外,下面两个语句有什么区别:

call_m<const foo>();

call_m<std::add_const<foo>::type>();

最佳答案

这似乎是 MSVC 的一个错误。使用 T() 形式的表达式(就标准而言,这是一种显式类型转换)导致指定类型的纯右值。

The expression T(), where T is a simple-type-specifier or typename-specifier for a non-array complete object type or the (possibly cv-qualified) void type, creates a prvalue of the specified type, which is value-initialized

只有对于非类类型,const将被忽略,因为非类纯右值不能具有 cv 限定类型的规则:

Class prvalues can have cv-qualified types; non-class prvalues always have cv-unqualified types.

因此 T() 创建的临时对象这里应该是const因此应该调用 const成员函数。

至于何时以及为何使用 std::add_const ,我们可以看看它被包含在the proposal中的原因.它指出 add_const , add_volatile , add_cv , add_pointer , 和 add_reference类型特征从提案中删除,但在 Boost 用户投诉后恢复。

The rationale is that these templates are all used as compile time functors which transform one type to another [...]

给出的例子是:

// transforms 'tuple<T1,T2,..,Tn>'
// to 'tuple<T1 const&,T2 const&,..,Tn const&>'
template< typename Tuple >
struct tuple_of_refs
{
// transform tuple element types
typedef typename mpl::transform<
typename Tuple::elements,
add_reference< add_const<_1> > // here!
>::type refs;
typedef typename tuple_from_sequence<refs>::type type;
};

template< typename Tuple >
typename tuple_of_refs<Tuple>::type
tuple_ref(Tuple const& t)
{
return typename tuple_of_refs<Tuple>::type(t);
}

可以想到mpl::transform将相当于函数指针的编译时元编程作为其第二个模板参数 - add_reference<add_const<...>>适用于 Tuple::elements 中的每种类型.这根本无法使用 const 来表达.

关于c++ - Const temporary from template type 以及为什么使用 std::add_const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15135859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com