1

我需要知道什么时候进行促销,以及促销活动是什么。我的猜测是

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 级可变参数的:

auto  r = va_arg( the_va_list, T );

如果我最初传入了一个在可变参数中使用时会被转换的类型,比如floats 变成doubles,我应该输入原始类型 forT还是 mangled 类型?如果是后者,我正在为此制作一个特征类型,这需要在最后一步中使用提升特征。

4

1 回答 1

0

粗略地说, abool ? T : T使 a T。在那个表达中没有任何东西得到提升。

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

例如,MSC 将结构的副本压入堆栈,而不调用构造函数(如果定义了构造函数)。

例如:

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 风格的可变参数列表中的东西,因为在这种情况下编译器对用户定义的类型所做的事情是未定义的。

于 2013-11-10T01:10:49.837 回答