首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型特征可以用于促销吗?

类型特征可以用于促销吗?
EN

Stack Overflow用户
提问于 2013-11-09 20:14:58
回答 1查看 220关注 0票数 1

我需要知道什么时候会有升职,升职是什么。我的猜测是

代码语言:javascript
复制
template <typename T>
struct promoted { using type = std::common_type_t<T, T>; };

template <typename T>
using promoted_t = typename promoted<T>::type;

显然,如果用户开始覆盖std::common_type的版本,这将会崩溃。假设这种情况没有发生,它会起作用吗?条件运算符应该在进一步求值之前应用提升。我确实认为有一天像这样的东西应该出现在《标准报》上。

如果你想知道我为什么想要这个,它是为C级的varargs准备的:

代码语言:javascript
复制
auto  r = va_arg( the_va_list, T );

如果我最初传入了一个在varargs中使用时会转换的类型,比如float变成了double的类型,我应该为T放入原始类型,还是放入损坏的类型?如果是后者,我将为其创建一个特征类型,这需要在最后一步中使用提升特征。

EN

回答 1

Stack Overflow用户

发布于 2013-11-10 09:10:50

粗略地说,一个bool ? T : T就是一个T。在该表达式中,没有任何内容会得到提升。

在C风格的可变参数列表中传递非POD(或者实际上是任何用户定义的)类型会调用未定义的行为。

例如,MSC在不调用构造函数(如果定义了构造函数)的情况下将结构的副本推送到堆栈上。

例如:

代码语言:javascript
复制
struct thing
{
    int v;

    // Not called
    operator int() const throw()
    {return this->v;}

    thing(int v) throw() :
    v(v)
    {}

    // Also not called
    thing(const thing &other) throw() :
    v(other.v)
    {}
};

void frob(...)
{
}

int main(int argc, const char **argv)
{
    thing t(47);

    frob(t); // <- rep stosd/q here, but this is really UD

    return 0;
}

编辑:

需要澄清的是:不可能使用模板来检测传递到C风格的可变参数列表中的内容,因为在这种情况下编译器对用户定义的类型做了什么是未定义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19875825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档