使用运算符 T* 构造对象的 Clang 编译器错误
Clang compiler error constructing object with operator T*
我在clang(xcode(中遇到了一个奇怪的编译器问题。我只是精简了代码以突出显示问题。当我构造对象时,我单独在 clang 中出现错误,但在 msvc 中工作正常。
在下面的代码中,msvc 正确地解析了基中的运算符 T*,并在以下两种情况下使用它来构造派生运算符。但叮当机灵地只允许第二种变体。
IDerivedT2 spDerived = spB; 错误
IDerivedT2 spDerived(spB(; 工程
struct IBase { };
template <typename T>
struct CContainer
{
CContainer() {}
CContainer(T* p) {}
CContainer& operator=(T* p)
{
return *this;
}
CContainer& operator=(CContainer& p)
{
return *this;
}
operator T*()
{
return nullptr;
}
};
template <typename T>
struct CContainerDerived : public CContainer<T>
{
CContainerDerived() : CContainer<T>() {}
CContainerDerived(T* p) : CContainer<T>(p) {}
CContainerDerived(IBase* p) { *this = p; }
CContainerDerived& operator = (IBase* p)
{
return *this;
}
};
struct IDerived : public IBase { };
typedef CContainer<IBase> IBaseT1;
typedef CContainerDerived<IDerived> IDerivedT2;
int main()
{
IBaseT1 spB;
IDerivedT2 spDerived = spB; //Error
//IDerivedT2 spDerived(spB); //Works
//IDerivedT2 spDerived; //Works
//spDerived = spB;
std::cout << "Hello, world!n";
}
http://rextester.com/VEVST22502(叮当(
http://rextester.com/ZOMDU93964 (MSVC(
我的xcode中的clang编译器版本是Apple LLVM版本7.3.0(clang-703.0.29(。rextester 中每个注释代码中的一个是 3.8。但行为似乎相似。
为什么这种情况只发生在叮当声上?
我被抛弃了,因为 MSVC 用模板做了一些时髦的事情,特别是名称查找,但这实际上很容易。
这是CContainer& operator=(CContainer& p)
.你在那里错过了一个const
,它应该是CContainer& operator=(CContainer const& p)
.
MSVC 还有另一个错误,它将临时引用绑定到非常量引用,如 p
。为什么这对你来说很重要?因为复制初始化IDerivedT2 spDerived = spB;
涉及一个临时IDerivedT2(spB)
,而直接初始化IDerivedT2 spDerived(spB)
不存在这种临时。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 为什么 Clang 警告未使用的指针和未使用的基元,而不是未使用的对象?
- l值引用对象上的Constexpr成员函数:Clang和gcc不同意
- clang libc :make_tuple与make_shared的组合导致早期对象破坏
- 如果对象在同一层次结构中,-Wreturn-std-move clang 警告是否正确
- 使用运算符 T* 构造对象的 Clang 编译器错误
- 为什么 Clang++ 不在另一个静态库中运行全局对象构造函数?
- clang++:无法分配抽象类型的对象
- 为什么 clang++ 只销毁一个 foo 对象
- Clang和G++在处理const对象时的差异
- 为什么gcc允许一个没有用户声明的默认构造函数的const对象,而不允许clang
- 我们不能混合使用g++和clang++编译的对象(或库)?至少在Mac上是这样
- 我需要与MinGW链接哪些库以使用Clang构建的对象文件