表达副作用的Clang警告

时间:2017-09-29 18:28:09

标签: c++ clang++ typeid

给出以下源代码:

#include <memory>
#include <typeinfo>

struct Base {
  virtual ~Base();
};

struct Derived : Base { };

int main() {
  std::unique_ptr<Base> ptr_foo = std::make_unique<Derived>();

  typeid(*ptr_foo).name();

  return 0;
}

并用以下内容编译:

clang++ -std=c++14 -Wall -Wextra -Werror -Wpedantic -g -o test test.cpp

环境设置:

linux x86_64
clang version 5.0.0

由于警告而无法编译(注意-Werror):

error: expression with side effects will be evaluated
      despite being used as an operand to 'typeid'
      [-Werror,-Wpotentially-evaluated-expression]
  typeid(*ptr_foo).name();

(请注意:海湾合作委员会并未声称存在这种潜在问题)

问题

有没有办法获取有关unique_ptr指向的类型的信息而不会产生这种警告?

注意:我谈论禁用-Wpotentially-evaluated-expression或避免-Werror

2 个答案:

答案 0 :(得分:5)

看起来以下应该在没有警告的情况下工作,并为派生类

提供正确的结果
std::unique_ptr<Foo> ptr_foo = std::make_unique<Bar>();

if(ptr_foo.get()){
    auto& r = *ptr_foo.get();
    std::cout << typeid(r).name() << '\n';
}

答案 1 :(得分:0)

std::unique_ptr<T>std::unique_ptr<T>::element_type提供了类型别名T。请尝试以下方法:

int main() 
{
  auto ptr_foo = std::make_unique<Foo>();

  typeid(decltype(ptr_foo)::element_type).name();

  return 0;
}