使用:: namespace :: something over namespace :: something有什么好处?

时间:2016-02-02 09:58:10

标签: c++ namespaces

我的新工作区的代码在开始时使用看似冗余的范围分辨率访问命名空间。例如,::std::vector<int>而不是std::vector<int> [1] 我以前从未见过以这种方式完成名称空间访问。

我能想到的一个有点人为的场景是,某些命名空间ns声明了一个嵌套的命名空间std,它也有vector(在本例中)。然后左侧的“附加”::确保正在使用全局std::vector,而不是本地std。但是,这不太可能是因为我们的代码经过了相当精细的审核流程,因此任何人都几乎不可能引入新的function onOpen() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var menuEntries = [{name: "Produce Conformance Logs (From Current Sheet)", functionName: "Produce"}, {name: "Delete Old Conformance Logs", functionName: "delSheets"} ]; ss.addMenu("Conformance Logs", menuEntries); } function Produce() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getActiveSheet(); var ui = SpreadsheetApp.getUi(); var eRange = sh.getRange("R9:R").getValues() var eLength = eRange.filter(String).length; var rData = sh.getRange(9, 18,eLength, 1).getValues(); // This is the data with the company names var conformanceSSheet = SpreadsheetApp.openById("1eMQv7muCHzKiyFxIlsdfgsdfgNpxovHiEINNZNtPUlEElIFs5ws"); var conformanceTemplate = conformanceSSheet.getSheetByName("Template"); var result = ui.alert( //title, prompt, buttons) 'Please confirm','Are you sure you want to produce Conformance Logs ?', ui.ButtonSet.YES_NO); if(result == ui.Button.YES){ for (i=rData.length-1;i>0;--i) conformanceTemplate.copyTo(conformanceSSheet).setName(rData[i]); } } 命名空间。

还有其他可能会产生影响的情况吗?

[1]我让团队中的一些高级开发人员向我解释这个问题,但他们只是含糊不清地知道为什么要使用这个“惯例”。几年前编写代码的最早的开发人员离开了团队,在他们离开之前没有人问他们。

1 个答案:

答案 0 :(得分:2)

我能想象的最值得注意的场景是使用std::tolower并迭代容器时:

#include <cctype>
#include <algorithm>

std::string str = "Masked Man";
std::transform(str.begin(), str.end(), str.begin(), ::tolower);

如@MatthieuM的this回答中所述,这是来自tolower<locale>的{​​{1}}函数之间的名称冲突。因为,在您的实现(it's actually unspecified)上,C ++标准库中延续的C标准库函数位于<cctype> 全局命名空间中,std显式使用::tolower中的那个。

因此,显式访问C ++标准库的C标准库是另一个原因,IMO。