给出以下源代码:
#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
。
答案 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;
}