如果我不显式地实例化模板,那么g++(带-fno-implicit-templates)从哪里获得模板定义呢?
Where does g++ (with -fno-implicit-templates) get template definitons from, if I dont explicitly instantiatie them?
下面的代码可以工作。
/* hello.cc */
#include <iostream>
#include <vector>
void vec_print()
{
std::vector<int> is(10, 1);
for (size_t i = 0; i < is.size(); ++i)
std::cout << is[i] << " ";
std::cout << std::endl;
}
/* main.cc */
void vec_print();
int main()
{
vec_print();
}
当我加上
g++ -fno-implicit-templates -Wall -Wextra -c hello.cc
g++ -fno-implicit-templates -Wall -Wextra -c main.cc
g++ hello.o main.o -o hello
我没有得到任何警告,它编译并运行良好。我的印象是这不应该发生。
该选项不阻止所有模板实例化,只阻止非内联模板实例化:
-fno-implicit-templates永远不要为隐式(即通过use)实例化的非内联模板发出代码;只发出显式实例化的代码。有关更多信息,请参见模板实例化。
编译器内联了代码中使用的所有vector
成员函数,因此编译成功。
当使用该选项编译时,以下代码将失败,因为它需要非内联实例化:
#include <vector>
int main()
{
auto f = &std::vector<int>::resize;
}
根据手册:
-fno-implicit-templates
Never emit code for non-inline templates which are instantiated implicitly (i.e. by use); only emit code for explicit instantiations.
现在在您的示例中,您正在实例化类型,然后调用在类模板定义内定义的方法,因此隐式inline
。
你可以试试:
template <typename T>
void noop( T const & ) {}
int main() {
noop(1);
}
然后用g++ -fno-implicit-templates -o test test.cpp
相关文章:
- -fno-unwind-tables 和 -fno-async-unwind-tables 不起作用 NDK clang
- 为什么子项目 CMAKE 不考虑 fno-sanitize,请禁用目标的消毒器
- C++生成文件错误"implicit entry/start for main executable"
- -fno-char8_t 的 MSVC 等效值是多少?
- Qt Creator 在执行步骤 "make" 时出现编译错误,-fno-stack-limit
- Qt creator语言 - fno-elide-constructors 不起作用
- "-fno-semantic-interposition"与"-fvisibility=p
- 使用 gcc 的 -fno-math-errno 可能有什么副作用?
- 在Macbook Pro上实现clang -fno-stack-protector编译代码时出现问题
- 为什么仅 -fno-signed-0 就可以实现优化,而似乎也需要 -ffinite-math-only (gcc)
- g++:如果在 -O2 或 -O3 之前指定,-fno-omit-frame-pointer 是否有效
- GCC 仍然使用 -fno-threadsafe-static 生成保护变量
- clang, std::function and -fno-rtti
- ObviousNistrem4(main), Implicit Runge Kutta 1(auxiliary) on
- 在 c++ 中是否有通过声明"implicit"数组分配?
- glibc函数的GCC、-flto、-fno内置和自定义函数实现
- 为什么混合 -fexceptions 和 -fno 异常没有链接器警告
- const int implicit conversion C++
- 如果我不显式地实例化模板,那么g++(带-fno-implicit-templates)从哪里获得模板定义呢?
- 将标志"-fno-implicit-templates"添加到 CMake 文件