首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板变量的显式专业化

模板变量的显式专业化
EN

Stack Overflow用户
提问于 2019-10-21 23:19:39
回答 1查看 328关注 0票数 5

类似于这个问题关于模板类的静态const类成员的显式专业化,以及关于模板类的显式专业化的这个问题,但是我的问题是变量模板的显式专业化。

我的MCVE:

代码语言:javascript
复制
//my_templated_literal.h
#pragma once

template <typename T>
constexpr T val;
代码语言:javascript
复制
//my_specialised_literal.h
#pragma once

#include "my_templated_literal.h"

template <>
constexpr int val<int> = 2;
代码语言:javascript
复制
//my_specialised_literal.cc
#include "my_specialised_literal.h"
代码语言:javascript
复制
//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修复是什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 01:31:38

我想我已经解决了:

这是大多数编译器版本默认接受的ODR冲突吗?

据我理解是的。根据存储类说明符偏好页面,模板变量应该具有外部链接,即使它是constexpr,这意味着在翻译单元中有多个定义是违反ODR的。根据页面底部链接的缺陷报告,“当前的实现似乎为const--合格变量模板的专门化提供了内部链接”,标准委员会认为这不是他们想要的行为。

针对这个问题的C++14修复是什么?

好像一个都没有。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58495283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档