类似于这个问题关于模板类的静态const类成员的显式专业化,以及关于模板类的显式专业化的这个问题,但是我的问题是变量模板的显式专业化。
我的MCVE:
//my_templated_literal.h
#pragma once
template <typename T>
constexpr T val;//my_specialised_literal.h
#pragma once
#include "my_templated_literal.h"
template <>
constexpr int val<int> = 2;//my_specialised_literal.cc
#include "my_specialised_literal.h"//main.cc
#include "my_specialised_literal.h"
int main() {}编译命令:编译命令:$CXX -std=c++14 my_specialised_literal.cc main.cc编译,在我尝试过的几乎每一个编译器版本上都像预期的那样工作,但是会给出clang-9的链接器错误:
/tmp/main-ec49c7.o:(.rodata+0x0):“`val”的多个定义 /tmp/my_specialised_literal-521691.o:(.rodata+0x0):首先在这里定义
这是大多数编译器版本默认接受的ODR冲突,还是clang-9在某种程度上是错误的?如果是前者,我知道如果我可以使用C++17,我可以通过创建专门化inline来修复它,但是针对这个问题的C++14修复是什么呢?
发布于 2019-11-08 01:31:38
我想我已经解决了:
这是大多数编译器版本默认接受的ODR冲突吗?
据我理解是的。根据存储类说明符偏好页面,模板变量应该具有外部链接,即使它是constexpr,这意味着在翻译单元中有多个定义是违反ODR的。根据页面底部链接的缺陷报告,“当前的实现似乎为const--合格变量模板的专门化提供了内部链接”,标准委员会认为这不是他们想要的行为。
针对这个问题的C++14修复是什么?
好像一个都没有。
https://stackoverflow.com/questions/58495283
复制相似问题