【问题标题】:Meaning of C++0x auto keyword, by example?C++0x auto 关键字的含义,例如?
【发布时间】:2011-04-16 15:15:08
【问题描述】:
auto a = (Foo<T>*)malloc(sizeof(Foo<T>));
auto *b = (Foo<T>*)malloc(sizeof(Foo<T>));

我认为模板的存在并不重要,但问题是:ab 是否属于同一类型?

g++ -std=c++0x -Wall (4.4) 没有给出任何错误或警告,但我没有运行该程序,所以我不知道它是否会做同样的事情。

这是否意味着对于aautoFoo&lt;T&gt;*,但对于bautoFoo&lt;T&gt;

【问题讨论】:

  • 只是想知道:为什么(Foo&lt;T&gt;*)malloc(sizeof(Foo&lt;T&gt;)) 而不是new Foo&lt;T&gt;
  • 什么是“新”东西?开玩笑。它是一些关于消息传递的多线程代码的一部分,我想要简单快速的规则。 “免费”只是释放内存,让你知道你有责任做任何你可能需要做的事情。但是,“删除”可以调用虚拟析构函数(较慢),并且可以调用可能有副作用的析构函数,随机破坏多线程代码。真的只是这样我才不会意外地将成员变量放入具有副作用的析构函数的消息中;没有通过阅读代码显而易见。 “删除 p;”太神秘了。

标签: c++ gcc c++11


【解决方案1】:

ab 是否属于同一类型?

让我们找出答案,好吗?

#include <cstdlib>
#include <type_traits>

template <typename T>
struct Foo
{
    T member;
};

template <typename T>
void test()
{
    auto  a = (Foo<T>*)malloc(sizeof(Foo<T>));
    auto *b = (Foo<T>*)malloc(sizeof(Foo<T>));

    static_assert(std::is_same<decltype(a), decltype(b)>::value, "same type");
}

template void test<int>();   // explicit instantiation

编译时不会出现静态断言失败。

这是否意味着对于aautoFoo&lt;T&gt;*,但对于bautoFoo&lt;T&gt;

是的。

【讨论】:

  • 更糟糕的是,它隐藏了typeid(a) != typeid (b) 的理论可能性。
  • @MSalters:也许我没有关注,但是如果它们是相同的类型,它们必须比较相等(尽管它们不必是相同的对象)。 @Fred:也许更好的答案只是一个is_same 元函数并打印is_same&lt;decltype(a), decltype(b)&gt;::value
  • @GMan:您的陈述是正确的,但很弱。你不能颠倒它。 IE。 “如果它们不是同一类型,它们可能会或可能不会比较不平等”。由于这个弱点,您的(以前的)static_assert 不能最终确定 ab 是同一类型。
【解决方案2】:

您可以将auto 视为占位符。在您的示例中,ab 的声明类型相同。唯一的区别是auto 在第一种情况下被推断为指针本身,而在第二种情况下它被推断为只是Foo&lt;T&gt;

除了一种特殊情况外,auto 的工作原理就像使用函数的模板参数推导:

template<class U>
void func_a(U);

template<class U>
void func_b(U*);

template<class T> struct Foo {};

template<class T>
void test() {
   func_a( new Foo<T> ); // U = Foo<T>*
   func_b( new Foo<T> ); // U = Foo<T>
}

在您的示例中,auto 的推导就像上面代码中的类型参数 U

我所说的特殊情况是初始化列表:

void test2() {
    auto x = {1,2,3};  // OK, decltype(x) --> initializer_list<int>
    func_a( {1,2,3} ); // Illegal, U cannot be deduced because
                       // {1,2,3} is not considered an expression
}

除此特例外,扣分规则相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2011-02-20
    • 2013-07-15
    • 2011-06-08
    • 2021-06-20
    • 1970-01-01
    • 2017-02-16
    • 2011-02-20
    相关资源
    最近更新 更多