std::value templated 方法的函数使用 clang 和 g++ 进行编译,但不使用 msvc 进行编译



以下代码使用 clang v5.0.0 和 g++ v8.1.0 编译,但在 Visual Studio (2013 和 2017( 中失败:

#include <string>
#include <functional>
#include <iostream>
template <const char* name>
std::string fct() {
return name;
}
const char toto[] = "toto";
std::function<std::string()> fctptr = fct<toto>;
int main(){
std::cout << fctptr() << std::endl;
} 

错误如下:

main.cpp(11): error C2440: 'initializing' : cannot convert from 'std::string (__cdecl *)(void)' to 'std::function<std::string (void)>'
1>          No constructor could take the source type, or constructor overload resolution was ambiguous

我试图将 std::function 替换为指向函数指针的 typedef,如下所示:

typedef std::string(*Fctptr)();
Fctptr fctptr = fct<toto>;

但是,我得到了同样的错误。

是 msvc 编译器的错误,还是上面的代码不符合标准。

FWIW,以下无法使用 g++ 6.4.0 (g++ -std=c++11( 编译失败。

#include <string>
#include <functional>
#include <iostream>
template <const char* name>
std::string fct() {
return name;
}
const char toto[] = "toto";
std::function<std::string()> fctptr = fct<toto>;
int main(){
std::cout << fctptr() << std::endl;
} 

下面是错误消息:

socc.cc:11:43: error: the value of ‘toto’ is not usable in a constant expression
std::function<std::string()> fctptr = fct<toto>;
^~~~
socc.cc:10:12: note: ‘toto’ was not declared ‘constexpr’
const char toto[] = "toto";

toto的定义更改为

constexpr char toto[] = "toto";

解决了问题。

最新更新