假设我们有一个模板函数,其非类型参数为 const char *,如下所示:
template <const char * MESSAGE> void print() {
std::cout << MESSAGE << '\n';
}
使用这个模板不会有问题,因为MESSAGE的日志可以在编译时推导出来,所以下面的用法是合法的:
namespace {
char namespace_message[] = "Anonymous Namespace Message";
constexpr char namespace_constexpr_message[] = "Anonymous Namespace Constexpr Message";
}
char message[] = "Message";
constexpr char constexpr_message[] = "Constexpr Message";
int main()
{
print<namespace_message>();
print<namespace_constexpr_message>();
print<message>();
print<constexpr_message>();
return 0;
}
但下面的不是(see here):
namespace {
const char namespace_const_message[] = "Anonymous Namespace Const Message";
}
const char const_message[] = "Const Message";
int main()
{
print<namespace_const_message>();
print<const_message>();
print<"Literal">();
return 0;
}
以上代码产生的错误如下:
the value of '{anonymous}::namespace_const_message' is not usable in a constant expression
我不明白为什么 namespace_const_message 不能在常量表达式中使用,而 namespace_message 是;如果我必须打赌其中一个不能用于常量表达式,我会打赌没有常量,但它已经可以用作常量表达式!
note: '{anonymous}::namespace_const_message' was not declared 'constexpr'
namespace_message 既没有被声明为 constexpr 并且被用于常量表达式并且它的值是在编译时推导出来的。为什么如果表达式是 const 则需要 constexpr 而如果不是 const 则不需要?
匿名命名空间之外的值也是如此,我试图强制编译时常量将值放入内部链接空间,但很明显我失败了。
最后,最后一个错误:
'"Literal"' is not a valid template argument for type 'const char*' because string literals can never be used in this context
所以,令人惊讶的是(至少这对我来说是一个惊喜)字符串文字不能用作模板参数,但只要字符串(嗯,指向以 null 结尾的字符数组的指针)是一个可编译的 -时间值它可以用作非类型模板参数,因此:它们在编译时可用,只要“它们是左值”(但它们是 already lvalues !)。
我试图猜测为什么在这种情况下永远不能使用字符串文字,我最好的猜测是具有相同内容的两个字符串文字不是相同的文字(因为指向内容的指针可以不同)而两个整数文字相同(它们是一个值,而不是指向值的指针)。
那么,这里的问题是什么?
namespace_const_message 和 const_message 在编译时不可用,因此在 print 模板函数中被禁止?谢谢。
最佳答案
模板的实例化变量需要有外部
链接,而 const 是隐式的内部链接。所以你必须
写:
extern char const constMessage[] = "Const message";
(另一种选择是它是一个静态类成员。 静态类成员总是有外部链接。)
字符串字面量的情况在某些方面是相似的:它们的类型是
char const[]。但更糟糕的是:模板实例化(至少
早期的)需要一个名称,而字符串文字没有。
更重要的是,不确定是否相同的字符串文字
是否是同一个对象,所以如下:
template <char const* m>
struct Toto { char const* f() const; };
Toto <"titi"> t1;
Toto <"titi"> t2;
t1 和 t2 是否具有相同的类型是不确定的。
关于c++ - 一些 const char * 在编译时不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28809728/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我想找到在某些文本中找到一些(让它是两个)句子的好方法。什么会更好-使用正则表达式或拆分方法?你的想法?应JeremyStein的要求-有一些例子示例:输入:ThefirstthingtodoistocreatetheCommentmodel.We’llcreatethisinthenormalway,butwithonesmalldifference.IfwewerejustcreatingcommentsforanArticlewe’dhaveanintegerfieldcalledarticle_idinthemodeltostoretheforeignkey,butinthis
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=
是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/